2011-12-11 15 views
8

Voglio testare un codice che si basa su una trasmissione di rete. Il codice effettua una richiesta e fornisce una richiamata - al termine della richiesta, viene attivata la richiamata. Mi piacerebbe prendere in giro la trasmissione di rete e usare Thread.sleep per simulare un po 'di latenza ... ma ovviamente questo farà sì che l'intero test venga messo in pausa.Test del codice asincrono con JUnit

Finora ho eseguito nuovi thread e utilizzando CountDownLatch es durante il test per interrompere il test prima che venga attivato il callback. Il mio oggetto di rete fittizio crea un nuovo thread, dorme su quel thread e quindi fa il callback. In realtà funziona piuttosto bene, ma il problema è che gli errori di asserzione nel callback non sono riportati al thread junit originale, ma sto ricevendo il testo di eccezioni sulla console, dove è molto più difficile da capire e da usare.

che sto sperando c'è uno:

  1. Un modo per tubo assertEquals uscita dai filetti generati nella principale collettore di uscita JUnit, o
  2. Un modo completamente diverso e migliore per testare codice filettato JUnit, o
  3. qualche modo per simulare codice asincrono in un singolo thread

Grazie per tutte le idee!

+0

perché non controllare QUnit: http://docs.jquery.com/QUnit –

risposta

4

Quando ho dovuto implementare un meccanismo asincrono simile al tuo, ho creato la classe astratta AsyncTestCase che contiene l'errore di test e fornisce il metodo speciale waitForCallback(). Quando un'attività asincrona trova errore nei risultati previsti, inserisce l'errore in questa variabile. Il setter chiama notify() per l'oggetto utilizzato da waitForCallback(). Quindi, quando arriva la richiamata, il test si attiva immediatamente. Quindi posso richiamare tutte le asserzioni incluso quello memorizzato dall'attività asincrona.

E non dimenticate di mettere timeout agli esami per impedire loro di dormire per sempre:

@Test(timeout=10000) 
public void mytest() { 
    callAsyncTask(); 
    waitForAsyncTask();  // from base class 
    assertAsyncTaskResult(); // from base class 
} 
+0

Ah, idea intelligente. Grazie! –

0

Quello che stai descrivendo è ConcurrentUnit. Ecco un esempio:

final Waiter waiter = new Waiter(); 

    new Thread(() -> { 
    doSomeWork(); 
    waiter.assertTrue(true); 
    waiter.resume(); 
    }).start(); 

    // Wait for resume() to be called 
    waiter.await(1000);