2012-12-23 19 views
5

Ich bin ein JUnit 4 Test mit @RunWith(value = Parameterized.class). Das funktioniert gut, keine Probleme dort. Jedoch, wenn einer meiner 34 Tests Timeout, bekomme ich nur die Nachricht java.lang.Exception: test timed out after 15000 milliseconds. Ich möchte, dass es auch den Parameter des Tests zeigt.Weitere Informationen hinzufügen, wenn JUnit 4 Timeouts mit parametrierter Runner

Ich habe sogar versucht, es wie der Code unten zu tun (was ich weiß, ist eine schreckliche Lösung für die meisten Fälle, ich wollte nur sehen, ob ich die Nachricht überhaupt irgendwann zeigen konnte), aber das tat es nicht Arbeit, es ergab sich immer noch die obige Nachricht.

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()); 
    } 
} 

Wie kann ich JUnit zeigt auch this.parameter, wenn die Testergebnisse in einem Timeout?

Hier ist ein sehr einfaches Beispiel Testklasse, die dieses Problem zeigt:

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

Mit diesem ShowMyMessageTest bekomme ich manchmal die erwartete „Timeout mit dem Wert 42 erreicht“, und manchmal bekomme ich nur „java.lang. Ausnahme: Test nach 1000 Millisekunden abgelaufen ". Ich möchte in diesem Fall immer "Timeout erreicht mit Wert 42" bekommen.

Antwort

5

Dies ist ein bisschen wie ein Hack, aber Sie @After verwenden könnte den Status des Parameters zu überprüfen:

@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); 
    } 
} 

Eine Alternative ist, Ihre eigene runner zu schreiben.

+0

Ihre Hacky-Lösung mit @After funktioniert gut genug für mich :) –

Verwandte Themen