Java 8 Lösung
Wenn Sie eine Lösung wünschen, die:
- Verwendet Java 8-Lambdas
- Hat nicht von irgendeiner JUnit-Magie abhängen
- Ermöglicht die Prüfung auf mehrere Ausnahmen innerhalb einer einzigen Testmethode
- Überprüft, ob eine Ausnahme von einer bestimmten Gruppe von Zeilen innerhalb Ihrer Testmethode ausgelöst wird, anstatt von jeder unbekannten Zeile in der gesamten Testmethode
- Liefert das tatsächliche Ausnahmeobjekt, das ausgelöst wurde, so dass Sie es weiter untersuchen können
Hier ist eine Dienstprogrammfunktion, die ich geschrieben habe:
public final <T extends Throwable> T expectException( Class<T> exceptionClass, Runnable runnable )
{
try
{
runnable.run();
}
catch( Throwable throwable )
{
if( throwable instanceof AssertionError && throwable.getCause() != null )
throwable = throwable.getCause(); //allows testing for "assert x != null : new IllegalArgumentException();"
assert exceptionClass.isInstance( throwable ) : throwable; //exception of the wrong kind was thrown.
assert throwable.getClass() == exceptionClass : throwable; //exception thrown was a subclass, but not the exact class, expected.
@SuppressWarnings( "unchecked" )
T result = (T)throwable;
return result;
}
assert false; //expected exception was not thrown.
return null; //to keep the compiler happy.
}
( aus meinem Blog )
Verwenden Sie es wie folgt:
@Test
public void testMyFunction()
{
RuntimeException e = expectException( RuntimeException.class, () ->
{
myFunction();
} );
assert e.getMessage().equals( "I haz fail!" );
}
public void myFunction()
{
throw new RuntimeException( "I haz fail!" );
}
27 Stimmen
Das Problem bei allen anderen Ansätzen ist, dass sie den Test immer beenden, sobald die Ausnahme ausgelöst wurde. Ich hingegen möchte oft noch
org.mockito.Mockito.verify
mit verschiedenen Parametern, um sicherzustellen, dass bestimmte Dinge geschehen (z. B. dass ein Logger-Dienst mit den richtigen Parametern aufgerufen wurde), bevor die Ausnahme ausgelöst wird.5 Stimmen
Sie können sehen, wie man Ausnahmen Test in JUnit Wiki-Seite github.com/junit-team/junit/wiki/Exception-testing
6 Stimmen
@ZeroOne - Für das würde ich zwei verschiedene Tests haben - eine für die Ausnahme und eine, um die Interaktion mit Ihrem Mock zu überprüfen.
0 Stimmen
Es gibt eine Möglichkeit, dies mit JUnit 5 zu tun, ich habe meine Antwort unten aktualisiert.
0 Stimmen
Hier ist ein schönes Beispiel für wie behaupten, dass eine Ausnahme geworfen wird es in JUnit4 und JUnit5