2012-06-18 11 views
5

Como en el título, quiero poner a prueba un método como este:¿Cómo probar un método de unidad que simplemente inicia un hilo con jUnit?

public void startThread() 
{ 
    new Thread() 
    { 
     public void run() 
     { 
      myLongProcess(); 
     } 
    }.start(); 
} 

EDIT: A juzgar por los comentarios que supongo que no es muy común para probar si un hilo se inicia o no. Así que tengo que ajustar la pregunta ... si mi requisito es una cobertura de código del 100%, ¿necesito probar si ese hilo se inicia o no? Si es así, ¿realmente necesito un marco externo?

+2

Creo que esto sería útil aquí: http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code –

+0

publiqué mi solución aquí: [introduzca la descripción del enlace aquí] (http://stackoverflow.com/a/39525700/3016686) –

Respuesta

6

Esto se puede hacer elegantemente con Mockito. Suponiendo que la clase se llama ThreadLauncher puede asegurarse el método startThread() dio lugar a una llamada de myLongProcess() con:

public void testStart() throws Exception { 
    // creates a decorator spying on the method calls of the real instance 
    ThreadLauncher launcher = Mockito.spy(new ThreadLauncher()); 

    launcher.startThread(); 
    Thread.sleep(500); 

    // verifies the myLongProcess() method was called 
    Mockito.verify(launcher).myLongProcess(); 
} 
+1

Considero que burlarse o espiar la clase bajo prueba es una mala práctica. En su lugar, verifique qué hace 'myLongProcess'. Debe HACER algo, verificarlo. Si está llamando para otra clase, simulan esa clase para verificar la llamada. –

+1

Mi comprensión de la pregunta es que él quiere probar si el método 'startThread()' od es el trabajo de iniciar un hilo. Él no pregunta cómo probar el resultado de 'myLongProcess()', supongo que ya sabe cómo hacerlo. –

+0

Gracias, vea EDITAR. – mt22

1

Si necesita una cobertura del 100%, tendrá que llamar a startThread que comenzará un hilo. Recomiendo hacer algún tipo de verificación de que el hilo se miró (verificando que algo en myLongProcess está sucediendo, luego limpiar el hilo. Entonces probablemente harías el resto de la prueba para myLongProcess invocando ese método directamente desde tu prueba de unidad.

Cuestiones relacionadas