Allo stato attuale, la verità gli autori consiglia di utilizzare il modello try/fallire/catch, in quanto questo è chiaro ed esplicito.
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");
}
Mentre @Rule ExpectedException
e @Test(exception=...)
esistono in JUnit, questi non sono raccomandati dal team di verità, nella misura in cui hanno alcuni modi sottili (e meno sottili) è possibile scrivere i test che passano ma che dovrebbe fallire.
Mentre questo vale anche per try/fail/catch, internamente Google lo mitiga con l'uso di error-prone, che fornisce un controllo statico in fase di compilazione per garantire che questo modello non ometta il fail(), ecc. Si consiglia vivamente di utilizzare questi controlli con analisi di errore o altri controlli statici. Purtroppo, i metodi basati su regole e annotazioni non sono facilmente interpretabili con l'analisi statica come questo blocco try/catch.
Detto questo, gli autori verità stanno lavorando su una caratteristica accogliente Java8, che dovrebbe essere simile a
assertThat(() -> doThrowingMethod())
.named("doThrowingMethod()")
.throwsException(SomeException.class)
.withMessageContaining("Foo bar")
.withCause(OtherThrowable.class);
Questo potrebbe essere utilizzato pre-java8, anche se sarebbe un po 'grossolano
ThrowingRunnable throwing = new ThrowingRunnable() {
@Override void run() throws Throwable {
doThrowingMethod();
}
};
assertThat(throwing)
.named("doThrowingMethod()")
.throwsException(SomeException.class)
.withMessageContaining("Foo bar")
.withCause(OtherThrowable.class);
Nota: API speculativa totalmente soggetta a modifiche. Questa risposta verrà aggiornata quando la funzione atterra.Coloro che vogliono seguirlo possibile guardare Issue #219
fonte
2016-08-10 07:04:21
Beh questo è una possibilità, ma secondo me è abbastanza brutto, simile a quello che ho usato per fare prima di Junit 4. Stavo pensando a qualcosa di più fluente del tipo: '' 'assertThat (" previsto "). willThrow (" whatever.class ")' '' – Imanol
Stiamo cercando qualcosa di più robusto per Java8, che sarà tanto meno. Qualcosa come 'assertThat (foo) .whenRunning (() -> runMethod()) .throws (Throwable.class) .withMessage (" blah ");' –
Er: 'assertThat (() -> runMethod()). (Throwable.class) .withMessage ("blah"); ' –