2015-08-11 21 views
6

Ho una classe ExampleThread che implementa l'interfaccia Runnable.Come testare una classe che implementa Runnable

public class ExampleThread implements Runnable { 

    private int myVar; 

    public ExampleThread(int var) { 
     this.myVar = var; 
    } 

    @Override 
    public void run() { 
     if (this.myVar < 0) { 
      throw new IllegalArgumentException("Number less than Zero"); 
     } else { 
      System.out.println("Number is " + this.myVar); 
     } 
    } 
} 

Come posso scrivere test JUnit per questa classe. Ho provato come sotto

public class ExampleThreadTest { 

    @Test(expected = IllegalArgumentException.class) 
    public void shouldThrowIllegalArgumentExceptionForInvalidNumber() { 
     ExampleThread exThread = new ExampleThread(-1); 

     ExecutorService service = Executors.newSingleThreadExecutor(); 
     service.execute(exThread); 
    } 
} 

ma questo non funziona. C'è un modo per testare questa classe per coprire tutto il codice?

+3

Test di thread non è così facile, ma in questo caso, vorrei semplicemente testare il metodo di esecuzione chiamandolo direttamente (senza ExecutorService). Se è davvero necessario testare System.out, è possibile impostarlo su qualcos'altro e quindi controllare il contenuto. –

risposta

10

Credo che si desidera solo verificare se il metodo run() fa la cosa giusta. Al momento si verifica anche il ServiceExecutor.

Se si desidera semplicemente scrivere un test di unità, è necessario chiamare il metodo run nel test.

public class ExampleThreadTest { 

    @Test(expected = IllegalArgumentException.class) 
    public void shouldThrowIllegalArgumentExceptionForInvalidNumber() { 
     ExampleThread exThread = new ExampleThread(-1); 
     exThread.run(); 
    } 
} 
2

Dal Java Doc,

vuoto execute (comando Runnable)

esegue il comando dato a un certo momento nel futuro. Il comando può essere eseguito in un nuovo thread, in un thread in pool o nel thread chiamante, a discrezione dell'implementazione di Executor.

Il che significa, il comando non avrebbe terminato l'esecuzione prima che il l'Testcase finito.

Quindi, quando IllegalArgumentException non viene lanciato prima della fine del testcase. Quindi fallirebbe.

È necessario attendere che termini prima di completare il test case.

@Test(expected = IllegalArgumentException.class) 
public void shouldThrowIllegalArgumentExceptionForInvalidNumber() { 
    ExampleThread exThread = new ExampleThread(-1); 

    ExecutorService service = Executors.newSingleThreadExecutor(); 
    service.execute(exThread); 

    // Add something like this. 
    service.shutdown(); 
    service.awaitTermination(<sometimeout>); 
} 
Problemi correlati