Después de leer la pregunta y algunos comentarios, parece que lo que necesita es una técnica para probar unidades de operaciones asincrónicas. doSomething() regresa inmediatamente, pero desea que el código de prueba espere su finalización y luego realice algunas validaciones.
El problema es que la prueba no tiene conocimiento de los hilos generados por la llamada, por lo que aparentemente no tiene forma de esperarlos. Uno puede pensar en muchas formas sofisticadas (y probablemente defectuosas) para resolver esto, pero en mi opinión hay un problema de diseño aquí. Una prueba unitaria debe simular un cliente de alguna API, y no debe asumir nada sobre la implementación; Solo debe probar la funcionalidad, como se refleja en la API y su documentación. Por lo tanto, evitaría tratar de detectar y rastrear los hilos creados por la llamada asynch. En cambio, mejoraría la API de la clase probada, si es necesario. La clase a la que pertenece la llamada de asincron debe proporcionar algún mecanismo para detectar la terminación. No puedo pensar en 3 maneras, pero probablemente hay más:
1) Permitir el registro de un oyente que consigue notificado una vez que se haya completado la operación
2) Proporcionar una versión sincrónica de la operación. La implementación puede llamar a la versión de bloqueo y luego bloquear hasta su finalización. Si la clase no debe exponer dicho método, su visibilidad se puede reducir al paquete protegido, para que la prueba pueda acceder a él.
3) Uso del patrón wait-notify, en algún objeto visible.
Si la clase no proporciona tal mecanismo, entonces no es realmente comprobable y, lo que es peor, probablemente tampoco sea muy reutilizable.
En realidad, yo evitaría esta solución, en su lugar estaba buscando una mejor manera de ejecutar este tipo de pruebas y forzar al hilo principal a esperar hasta el final de sus hijos. – Mark
@Marco: ¿pueden por favor dar más detalles? ¿Qué pasa con la solución de Chris? –
Estoy probando un método doSomething() que inicia internamente algunos subprocesos que actualizan algunas tablas db. Lo que me gustaría hacer es ejecutar este método dentro de mi prueba JUnit y luego verificar si todas las ediciones en la base de datos se han guardado con éxito. Es importante que el método doSomething() no se una a los subprocesos cuando se crean, por lo que no puedo adoptar la solución join(). – Mark