Ich habe meine Ausnahmen immer mit Anmerkungen getestet.Sollte ich immer Lambda Expressions für Ausnahmetests verwenden?
@Test (expected = Exception.class)
public void test1() {
methodToTest() // throws an exception
}
Ich wechselte schließlich zu Java 8, und ich kam in Lambda-Ausdrücke. Jetzt gibt es eine weitere Option, um das gewünschte Ergebnis zu erhalten.
@Test
public void test2() {
assertThrows(Exception.class,() -> methodToTest());
}
public static <X extends Throwable> Throwable assertThrows(
final Class<X> exceptionClass, final Runnable block) {
try {
block.run();
} catch(Throwable ex) {
if (exceptionClass.isInstance(ex))
return ex;
}
fail("Failed to throw expected exception");
return null;
}
Ich verstehe, dass mit der zweiten Version, die Sie genauer für einzelne Methoden überprüfen, und Sie müssen sich keine Gedanken über andere Methoden in einem einzigen Test sorgen, dass die erwartete Ausnahme auch werfen könnte. Außerdem können alle Tests bei einer "assertThrows" -Methode die gleiche Struktur haben, weil es auf einen Aufruf für eine Assertion ankommt.
Neben diesen beiden Punkten, gibt es irgendwelche Argumente für den neuen Weg? Für mich fühlt es sich immer noch besser an, mit den Anmerkungen zu gehen, solange ich nur eine einzige Methode innerhalb eines einzigen Tests teste.
Wo die Lambda-Ausdrücke in dieser sind Frage? – Dici
"test2" übergibt einen Lambda-Ausdruck an die assertThrows-Methode, die als Runnable behandelt wird. – leimooo
Fragen Sie, warum es notwendig ist, einen Lambda-Ausdruck zu verwenden?Oder warum Sie all dies tun würden, anstatt die @Test-Annotation (expected = Exception.class) zu verwenden? Wenn es das letztere ist, haben Sie es selbst ziemlich beantwortet, das sind 2 gute Punkte. –