2012-12-23 6 views
5

Sto eseguendo un test JUnit 4 utilizzando @RunWith(value = Parameterized.class). Funziona bene, nessun problema lì. Tuttavia, quando uno dei miei 34 test timeout, ricevo solo il messaggio java.lang.Exception: test timed out after 15000 milliseconds. Voglio che mostri anche il parametro del test.Aggiunta di ulteriori informazioni quando JUnit 4 timeout con runner parametrizzato

Ho anche provato a farlo come il seguente codice (che so essere una soluzione orribile per la maggior parte dei casi, volevo solo vedere se potevo far visualizzare il messaggio in qualsiasi momento), ma questo non lavoro, ha comunque portato al messaggio sopra.

private String parameter; 

@Test(timeout = 15000) 
public void solveAll() { 
    try { 
     // ... do something that might take a long time 
    } 
    catch (Throwable e) { 
     Assert.fail(this.parameter + " failed! Because of " + e.getMessage()); 
    } 
} 

Come posso fare JUnit mostrano anche this.parameter quando i risultati dei test in un timeout?

Ecco un semplice esempio di classe di test che mostra questo problema:

public class ShowMyMessageTest { 
    @Test(timeout=1000) 
    public void test() { 
     try { 
      Thread.sleep(3000); 
     } 
     catch (Throwable e) { 
      Assert.fail("Timeout reached with value 42"); 
     } 
    } 
} 

Con questo ShowMyMessageTest volte ho l'atteso "Timeout raggiunto con il valore di 42", e qualche volta ottengo solo "java.lang. Eccezione: test scaduto dopo 1000 millisecondi ". Voglio sempre ottenere "Timeout raggiunto con il valore 42" in questo caso.

risposta

5

Questo è un po 'di un hack, ma si potrebbe usare @After per verificare lo stato del parametro:

@RunWith(Parameterized.class) public class FooTest { 
    private boolean flag = true; 
    private String param; 

    public FooTest(String param) { 
    this.param = param; 
    } 

    @Test(timeout = 1000) public void test() { 
    while(true == flag); 
    param = null; 
    } 

    @After public void after() { 
    Assert.assertNull("Problem:" + param, param); 
    } 

    @Parameters public static Collection<Object[]> params() { 
    Object[][] params = { { "foo" } }; 
    return Arrays.asList(params); 
    } 
} 

Un'alternativa è quella di scrivere il proprio runner.

+0

La tua soluzione hacky con @After funziona abbastanza bene per me :) –

Problemi correlati