Gegenwärtig empfehlen die Autoren der Wahrheit die Verwendung des Try/Fail/Catch-Musters, da dies klar und deutlich ist.
try {
doSomethingThatThrows();
fail("method should throw");
} catch (SpecificException e) {
// ensure that e was thrown from the right code-path
// especially important if it's something as frequent
// as an IllegalArgumentException, etc.
assertThat(e).hasMessage("blah blah blah");
}
Während @Rule ExpectedException
und @Test(exception=...)
in JUnit vorhanden sind, werden diese nicht von der Wahrheit Team empfohlen, sofern sie einige subtile (und weniger subtile) Möglichkeiten, wie Sie Tests schreiben können, aber die nicht ausfallen sollte passieren.
Obwohl dies auch für try/fail/catch gilt, verringert Google dies intern durch die Verwendung von error-prone, die eine statische Kompilierzeitprüfung bietet, um sicherzustellen, dass dieses Muster fail() usw. nicht auslässt. Es wird dringend empfohlen, dass Sie eine fehleranfällige oder eine andere statische Analyseprüfung verwenden, um diese zu erfassen. Leider sind die regelbasierten und annotationsbasierten Methoden für statische Analysen nicht so leicht zugänglich wie dieser try/catch-Block.
Das heißt, die Wahrheit Autoren auf einem Java8 freundliche Funktion arbeiten, die so etwas wie
assertThat(() -> doThrowingMethod())
.named("doThrowingMethod()")
.throwsException(SomeException.class)
.withMessageContaining("Foo bar")
.withCause(OtherThrowable.class);
Diese Pre-java8 verwendet werden könnte aussehen sollte, wenn es etwas grob
wäre
Hinweis: Speculative API unterliegt Änderungen. Diese Antwort wird aktualisiert, wenn das Feature landet.Diejenigen, die verfolgen möchten, können es Issue #219
Nun, das ist eine Option, aber IMHO ist ziemlich hässlich, ähnlich dem, was ich zu tun pflegte, vor Junit 4. Ich wurde in etwas mehr fließend wie denken: '' 'assertThat (“ erwartet "). wantThrow (" whatever.class ")' '' – Imanol
Wir betrachten etwas robusteres für Java8, das wird weniger. Etwas wie 'assertThat (foo) .wennRunning (() -> runMethod()) .throws (Throwable.class) .withMessage (" blah ");' –
Er: 'assertThat (() -> runMethod()) (Throwable.class) .withMessage ("blah"); ' –