2016-05-20 25 views
5

Ho un test di comunicazione su un socket TCP in cui prevedo che il server non risponda entro un intervallo di tempo impostato quando invio un determinato messaggio.Test JUnit per un timeout previsto

Il comportamento del server è nulla che possa controllare.

So caldo per fallire un test se non è stato completato entro un periodo di tempo prestabilito. Ma come posso fare il contrario, farlo passare per non completarlo entro i tempi?

Posso usare @Test (timeout=1000) per fare fallire un test se non completo entro un secondo.

Ma, utilizzando Junit 4, esiste una funzione per verificare un timeout previsto come risultato positivo? Cioè Il test fallirà se completato entro il periodo di tempo e passerà se no?

+0

Vuol il timeout gettare un'eccezione? Se lo fa, puoi provare per quell'eccezione di timeout. – Compass

+0

Stai attento a questo, non penso che tu possa "aspettarti" l'eccezione generata da "timeout". È possibile utilizzare un timer o semplicemente controllare l'ora dell'operazione quindi, se è il momento desiderato, generare un'eccezione che si aspetta. Non sembra molto efficiente però. – Zircon

+2

Inoltre, qual è esattamente lo scopo del test? Se esce dall'ambito del tuo codice a valle del server, non sono sicuro di quanto sia utile testare sul tuo terminale. Se ti aspetti che il tuo codice gestisca il timeout, devi semplicemente prendere in giro il socket e restituire l'eccezione. – Compass

risposta

4

Buona domanda. In realtà puoi farlo usando solo gli strumenti junit. La mia idea è di invertire il comportamento della regola Timeout + utilizzare l'attributo expected dell'annotazione Test. L'unico limite: quello che dovete inserire il vostro test in classe a parte, perché Rule si applica a tutti i test al suo interno:

public class Q37355035 { 

    private static final int MIN_TIMEOUT = 100; 

    @Rule 
    public Timeout timeout = new Timeout(MIN_TIMEOUT) { 
     public Statement apply(Statement base, Description description) { 
      return new FailOnTimeout(base, MIN_TIMEOUT) { 
       @Override 
       public void evaluate() throws Throwable { 
        try { 
         super.evaluate(); 
         throw new TimeoutException(); 
        } catch (Exception e) {} 
       } 
      }; 
     } 
    }; 

    @Test(expected = TimeoutException.class) 
    public void givesTimeout() throws InterruptedException { 
     Thread.sleep(1000); 
    } 
}