2012-06-18 15 views
5

Come nel titolo, voglio testare un metodo come questo:Come testare un metodo che avvia semplicemente un thread con jUnit?

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

EDIT: A giudicare dai commenti credo che non è molto comune per verificare se un thread si avvia o meno. Quindi devo aggiustare la domanda ... se il mio requisito è una copertura del 100% del codice devo testare se quel thread inizia o no? In tal caso, ho davvero bisogno di un framework esterno?

+2

Penso che sarebbe utile qui: http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code –

+0

ho postato la mia soluzione qui: [inserire la descrizione del collegamento qui] (http://stackoverflow.com/a/39525700/3016686) –

risposta

6

Questo può essere fatto elegantemente con Mockito. Supponendo che la classe si chiama ThreadLauncher è possibile garantire il metodo startThread() ha provocato una chiamata di 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

Prenderò in considerazione la possibilità di deridere o spiare la classe sotto test, ma verificare invece cosa 'myLongProcess' fa. Deve fare qualcosa, verificarlo. per l'altra classe, simula quella classe per verificare la chiamata. –

+1

La mia comprensione della domanda è che vuole verificare se la metrica 'startThread()' od fa il lavoro di iniziare una discussione. Non chiede come testare il risultato di 'myLongProcess()', presumo che sappia già come farlo. –

+0

Grazie, vedi EDIT. – mt22

1

Se avete bisogno di una copertura del 100%, è necessario chiamare startThread, che prenderà il via a un filo. Suggerisco di fare una sorta di verifica dell'avanzamento del thread (verificando che qualcosa in myLongProcess stia accadendo, quindi ripulire il thread, quindi probabilmente eseguirai il resto del test per myLongProcess invocando quel metodo direttamente dal test dell'unità.

Problemi correlati