it-swarm.com.de

Ausnahmen beim Testen von JUnit

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ösen soll, 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, wird ein roter Balken angezeigt, obwohl ich fast zu 100% sicher bin, dass die Konstruktormethode tatsächlich eine Ausnahme auslöst, wenn solche Parameter an ihn übergeben werden.

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

81
papercuts
@Test(expected = Exception.class)  

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

For

@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 Link könnte helfen.

126
xyz

sind Sie sicher, dass Sie die Ausnahme erwartet haben?

für neuere Junits (> = 4.7) können Sie so etwas wie (from here ) 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, das:

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

Ein Vorteil der ExpectedException-Regel (Version 4.7) besteht darin, dass Sie die Ausnahmemeldung und nicht nur die erwartete Ausnahme testen können.

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

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

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 diesen JUnit-Test ausführen, wird ein grüner Balken angezeigt:

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

Obwohl @Test(expected = MyException.class) und die ExpectedException-Regel 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 catch-exception ; Ab Mai 2014 scheint sich das Projekt jedoch im Wartungsmodus zu befinden (überholt durch Java 8)), und ähnlich wie Mockito kann catch-exception nur Methoden manipulieren, die nichtfinal sind .

5
Jeff Bowman