2013-05-29 7 views
5

Nota: Sto utilizzando JUnit 4.11 e Netty 3.6.5.JUnit e Netty causano la fine prematura dell'applicazione

Sto provando a testare alcune funzionalità di base nella mia complicata app del server. Voglio estrarre semplicemente la funzionalità di rete e fare alcuni test unitari. Tuttavia, quando provo a creare un unit test, l'applicazione esce semplicemente. Tuttavia, se metto un dummy public static void main, funziona correttamente, ma al di fuori di JUnit, ovviamente. Ecco il sscce:

public class SimpleNetwork { 
    private Injector inj; 

    @Before 
    public void startInjector() { 
     Module mod = new AbstractModule() { 
      @Override 
      protected void configure() { 
       // Guice stuff you don't need to see, it works fine 
      } 
     }; 
     inj = Guice.createInjector(mod); 
    } 

    // **When I run this using JUnit, the application ends immediately.** 
    @Test 
    public void testNetwork() { 
     NioServer server = inj.getInstance(NioServer.class); 
     server.run(); 

     // **This prints in both scenarios** 
     System.out.println("Hello World"); 
    } 

    // **When I run this, the application works as expected.** 
    public static void main(String[] args) { 
     SimpleNetwork sn = new SimpleNetwork(); 

     sn.startInjector(); 
     sn.testNetwork(); 
    } 
} 
+0

Puoi eseguire il debug in NioServer? – fge

+0

@fge Sì, il metodo 'run' ha un debug' println' che succede – durron597

+2

Le cose piccole sono * asincrone *, il test runner non aspetta che finiscano altri thread, devi organizzarlo nel tuo metodo di test. –

risposta

4

Junit uscirà il test non appena il filo JUnit è fatto mentre il vostro principale aspetterà per i thread non demone per terminare prima di uscire. È necessario mettere in pausa il thread junit e attendere che qualunque evento si verifichi.

Non è chiaro cosa si stia tentando di testare.

  • Se hai solo bisogno di testare che il tuo server possa essere avviato, allora il tuo test attuale fa proprio questo. In particolare, il collegamento fornito mostra un server che viene eseguito in un thread in background, pertanto il metodo run restituisce immediatamente. Quindi il tuo test verifica che il metodo run ritorni senza problemi.
  • Se si desidera effettivamente esercitare il server inviando dati e controllando ciò che viene ricevuto (ad esempio). In tal caso, è necessario includere il codice che testa il server con lo stesso metodo di prova.

Un modo più tipico di testare una cosa del genere sarebbe quello di avviare il server una volta per tutta la classe di test:

private NioServer server; 
@BeforeClass 
public void beforeClass() { 
    server = getServer(); 
    server.run(); 
} 

@Test 
public void testOne() { 
    sendSomeDataToServer("data"); 
    assertEquals("data", server.getLastReceivedData()); 
} 

(io non sono sicuro al 100% sulla sintassi JUnit come io uso TestNG ma dovrebbe essere qualcosa del genere)

+0

Questa classe fa parte dell'ambiente di test del server. Stai dicendo, avvia il server in '@ BeforeClass', quindi crea alcune connessioni client a se stesso? – durron597

+0

@ durron597 Questo è un modo sì. Un altro modo sarebbe usare gli oggetti finti. Che cosa stai cercando di testare esattamente? Quando ti aspetti che il test passi o fallisca? Se chiarisci che sarà più facile aiutarti. – assylias

+0

Huh. Facendo questa domanda mi chiedo se il mio approccio stia cercando di coprire troppo codice contemporaneamente. Ho iniziato a digitare "assicurati che il server costruisca e decostruisca correttamente gli oggetti" eccetto perché non sto testando gli encoder direttamente in quel momento? – durron597