JUnit-Testausnahmen [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Papierschnitte

Ich bin wirklich neu in Java.

Ich führe einige JUnit-Tests auf einem Konstruktor aus. Der Konstruktor ist so beschaffen, dass er eine Ausnahme auslöst, wenn er für einen seiner Parameter eine Null oder eine leere Zeichenfolge erhält.

Wenn ich diesen Konstruktor in JUnit mit einem Null- oder einem leeren Zeichenfolgenparameter teste, erhalte ich einen roten Balken, obwohl ich fast 100 % sicher bin, dass die Konstruktormethode tatsächlich eine Ausnahme auslöst, wenn ihr solche Parameter übergeben werden.

Sollte es in JUnit nicht einen grünen Balken geben, wenn die Methode wie vorgesehen eine Ausnahme auslöst? Oder ist es das, wenn Sie einen roten Balken erhalten sollen, wenn das Auslösen von Ausnahmen so funktioniert, wie es soll?

Benutzer-Avatar
Ajinkya

@Test(expected = Exception.class)  

Teilt Junit mit, dass die Ausnahme das erwartete Ergebnis ist, sodass der Test bestanden wird (grün markiert), wenn die Ausnahme ausgelöst wird.

Zum

@Test

Junit betrachtet den Test als fehlgeschlagen, wenn eine Ausnahme ausgelöst wird. sofern es sich um eine ungeprüfte Ausnahme handelt. Wenn die Ausnahme aktiviert ist, wird sie nicht kompiliert und Sie müssen andere Methoden verwenden. Dies Verknüpfung könnte helfen.

  • Aber wie kann man die benutzerdefinierte Nachricht über diese Lösung weitergeben? Ich meine, die Geschäftslogik ist: throw IOException("username can't be null"). ich weiss Bescheid org.junit.rules.ExpectedExceptionaber ich möchte keine Instanz erstellen und verwenden .expect( und .expectMessage(

    – Dr.jacky

    8. Oktober 2019 um 8:09 Uhr

Benutzer-Avatar
Radai

Sind Sie sicher, dass Sie ihm gesagt haben, dass er die Ausnahme erwarten soll?

für neuere junit (>= 4.7) können Sie so etwas wie (ab hier) verwenden

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void testRodneCisloRok(){
    exception.expect(IllegalArgumentException.class);
    exception.expectMessage("error1");
    new RodneCislo("891415",dopocitej("891415"));
}

und für ältere junit dies:

@Test(expected = ArithmeticException.class)  
public void divisionWithException() {  
  int i = 1/0;
}

  • Wenn die Testklasse eine Ausnahme auslöst, können Sie einfach die Ausnahme auslösen und testen, wo Sie die Junit-Testfälle geschrieben haben. mit @Test(expected = IllegalArgumentException.class)

    – Janitha Madushan

    3. November 2015 um 7:20 Uhr


Wenn Ihr Konstruktor diesem ähnlich ist:

public Example(String example) {
    if (example == null) {
        throw new NullPointerException();
    }
    //do fun things with valid example here
}

Wenn Sie dann diesen JUnit-Test ausführen, erhalten Sie einen grünen Balken:

@Test(expected = NullPointerException.class)
public void constructorShouldThrowNullPointerException() {
    Example example = new Example(null);
}

Ein Vorteil der Verwendung von ExpectedException Rule (Version 4.7) besteht darin, dass Sie Ausnahmemeldungen und nicht nur die erwartete Ausnahme testen können.

Und mit Matchers können Sie den Teil der Nachricht testen, der Sie interessiert:

exception.expectMessage(containsString("income: -1000.0"));

Benutzer-Avatar
Jeff Bowmann

Obwohl @Test(expected = MyException.class) und die Erwartete Ausnahmeregel eine sehr gute Wahl sind, gibt es einige Fälle, in denen das Abfangen von Ausnahmen im JUnit3-Stil immer noch der beste Weg ist:

@Test public void yourTest() {
  try {
    systemUnderTest.doStuff();
    fail("MyException expected.");
  } catch (MyException expected) {

    // Though the ExpectedException rule lets you write matchers about
    // exceptions, it is sometimes useful to inspect the object directly.

    assertEquals(1301, expected.getMyErrorCode());
  }

  // In both @Test(expected=...) and ExpectedException code, the
  // exception-throwing line will be the last executed line, because Java will
  // still traverse the call stack until it reaches a try block--which will be
  // inside the JUnit framework in those cases. The only way to prevent this
  // behavior is to use your own try block.

  // This is especially useful to test the state of the system after the
  // exception is caught.

  assertTrue(systemUnderTest.isInErrorState());
}

Eine andere Bibliothek, die behauptet, hier zu helfen, ist Fang-Ausnahme; Ab Mai 2014 scheint sich das Projekt jedoch im Wartungsmodus zu befinden (veraltet durch Java 8), und ähnlich wie Mockito kann die Catch-Exception nur Nicht-final Methoden.

1257070cookie-checkJUnit-Testausnahmen [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy