2016-07-18 1 views

Antwort

9

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

0

Sie meinen, Sie brauchen so etwas wie:

 try { 

      //do here something that should throw exception 
      //... 
      assertTrue("expected exception when .......", false); 

     } catch (Exception ex) {} 

??

+2

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

+0

Wir betrachten etwas robusteres für Java8, das wird weniger. Etwas wie 'assertThat (foo) .wennRunning (() -> runMethod()) .throws (Throwable.class) .withMessage (" blah ");' –

+0

Er: 'assertThat (() -> runMethod()) (Throwable.class) .withMessage ("blah"); ' –

2

Es gibt derzeit keine integrierte Möglichkeit, eine erwartete Exception mit google-truth zu verifizieren. Sie können eine der folgenden Aktionen ausführen:

ich glaube google-truth keine s hat imilar Funktionalität, weil es supports Java 1.6.

+0

Wir suchen etwas robusteres für Java8, das wird weniger. Etwas in der Art von 'assertThat (() -> runMethod()). Throws (Throwable.class) .withMessage (" blah ");' –

2

beobachten, wie ein Update hier, wir sind umgezogen weg von dem Muster Christian beschrieben, und Issue #219 hat sich für JUnit expectThrows() (kommt in 4.13, ähnliche Verfahren bereits geschlossen existiert in TestNG's Assert).

Im Tandem mit expectThrows() können Sie Truth verwenden, assertions about the thrown exception zu machen. So Christians Beispiel wäre jetzt:

SpecificException expected = expectThrows(
    SpecificException.class,() -> doSomethingThatThrows()); 
assertThat(expected).hasMessageThat().contains("blah blah blah"); 
Verwandte Themen