2010-12-01 2 views
1

ich den folgenden Test haben:Custom Messages zu JUnit4 Stil Ausnahme Hinzufügen von Tests

@Test(expected=ArithmeticException.class) 
    public void divideByZero() { 
    int n = 2/1; 
} 

als gesehen.

Ich möchte eine Nachricht hinzuzufügen, wenn dieser Test fehlschlägt gedruckt wird.

Zum Beispiel, wenn ich eine Assertion Test tat, ich eine Nachricht folgenden hinzuzufügen tun würde:

@Test public void assertFail(){ 
    Assert.fail("This is the error message I want printed."); 
    Assert.assertEquals(true, false); 
} 

Das zweite Beispiel soll „Dies ist die Fehlermeldung I gedruckt werden soll.“ Ausdrucken. Wie lege ich den ersten Beispielnachrichtentext fest?

Antwort

1

Ich glaube nicht, können Sie einfach, aber this Kerl zu haben scheint arbeitete teilweise um es seinen Weg.

2

Vielleicht sollte @Rule Anmerkung helfen. In der Klasse Unit-Test sth wie folgt hinzu:

import org.junit.Rule; 
import org.junit.rules.MethodRule; 
import org.junit.runners.model.Statement; 
import org.junit.runners.model.FrameworkMethod; 
import org.junit.internal.runners.model.MultipleFailureException; 
... 
@Rule 
public MethodRule failureHandler = new MethodRule() 
{ 
    @Override 
    public Statement apply(final Statement base, FrameworkMethod method, Object target) 
    { 
     return new Statement() 
     { 
      @Override 
      public void evaluate() throws Throwable 
      { 
       List<Throwable> listErrors = new ArrayList<Throwable>(); 
       try 
       { 
        // Let's execute whatever test runner likes to do 
        base.evaluate(); 
       } 
       catch (Throwable testException) 
       { 
        // Your test has failed. Store the test case exception 
        listErrors.add(testException);       
        // Now do whatever you need, like adding your message, 
        // capture a screenshot, etc., 
        // but make sure no exception gets out of there - 
        // catch it and add to listErrors 
       } 
       if (listErrors.isEmpty()) 
       { 
        return; 
       } 
       if (listErrors.size() == 1) 
       { 
        throw listErrors.get(0); 
       } 
       throw new MultipleFailureException(listErrors); 
      } 
     }; 
    } 
}; 

Statt alle Ausnahmen in listErrors sammeln können Sie prüfen testException mit Ausnahme mit zusätzlichen Nachricht Einwickeln und warf es einfach.

+0

Wir arbeiten daran zu beweisen, dass dies eine Lösung ist. Vielen Dank. – KevinO

+0

@KevinO Ich habe etwas ähnliches mit Regeln einmal (einen Screenshot nach gescheiterter Test). Wenn Sie interessiert sind, kann ich meine Lösung anbieten. Ich bin mir jedoch nicht sicher, wie ich mit Ausnahmen umgehen soll. Daher würde ich mich freuen, wenn Sie Ihre Lösung teilen. –

+0

ich war nicht erfolgreich bei einer junit Fehlermeldung Zugabe mit ExpectedException. – KevinO

1

Ich empfehle Namensgebung statt den Test offensichtlich zu machen, was der Test-Tests ist, so dass, wenn einige Ihrer Tests fehlschlagen, sie sagen, was das Problem ist. Hier ist ein Beispiel für die ExpectedException Regel:

@RunWith(JUnit4.class) 
public class CalculatorTest { 
    @Rule 
    public ExpectedException exception = ExpectedException.none(); 

    @Test 
    public void divisionByZeroShouldThrowArithmeticException() { 
    Calculator calculator = new Calculator(); 

    exception.expect(ArithmeticException.class); 
    calculator.divide(10, 0); 
    } 
} 

Einzelheiten zu ExpectedException finden this article und the ExpectedException JavaDoc

1

Wenn Sie bereit sind catch-exception zu verwenden, anstatt von JUnit-internen Ausnahmebehandlungsmechanismen, dann kann Ihr Problem sein leicht gelöst:

catchException(myObj).doSomethingExceptional(); 
assertTrue("This is the error message I want printed.", 
      caughtException() instanceof ArithmeticException);