2013-03-05 13 views
70

Jestem naprawdę nowy w Javie.JUnit Testing Exceptions

Używam niektórych testów JUnit na konstruktorze. Konstruktor jest taki, że jeśli zostanie podany zerowy lub pusty ciąg dla jednego z jego parametrów, powinien wygenerować wyjątek.

Kiedy testuję ten konstruktor w JUnit z pustym parametrem lub pustym parametrem, otrzymuję czerwony pasek, mimo że jestem prawie w 100% pewien, że metoda konstruktora rzeczywiście rzuca wyjątek, gdy parametry te są przekazywane do tego.

Nie powinien być zielony pasek w JUnit, jeśli metoda zgłasza wyjątek w taki sposób, jak powinien? A może kiedy masz dostać czerwony pasek, gdy rzucanie wyjątkami działa tak, jak powinno?

Odpowiedz

108
@Test(expected = Exception.class) 

Informuje Junit, że wyjątek jest oczekiwanym wynikiem, więc test zostanie zaliczony (oznaczony jako zielony), gdy zostanie zgłoszony wyjątek.

Dla

@Test 

Junit uzna za nieudaną próbę jeśli jest wyjątek.
Ten link może pomóc.

38

Czy na pewno powiedziałeś mu, aby oczekiwał wyjątku?

dla nowszych JUnit (> = 4.7), można użyć coś podobnego (od here)

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

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

i dla starszych JUnit, to:

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

Jeśli klasa testowa zgłasza wyjątek, można po prostu wyrzucić wyjątek i sprawdzić, gdzie zostały napisane przypadki testowe Junit. przy użyciu @ test (expected = IllegalArgumentException.class) –

5

Jeśli konstruktor jest podobny do tego jeden:

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

Następnie, po uruchomieniu testu JUnit otrzymasz zielony pasek:

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

atutem z reguły stosowanie ExpectedException (wersja 4.7) jest to, że można przetestować wiadomość wyjątku i nie tylko oczekiwany wyjątek.

i przy użyciu dopasowujących można przetestować część wiadomości, którą jesteś zainteresowany:

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

Choć @Test(expected = MyException.class) i ExpectedException rule są bardzo dobrym wyborem, istnieją pewne przypadki, w których wyjątek JUnit3 stylu wzrok jest nadal najlepszy sposób na:

@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()); 
} 

Inna biblioteka, która twierdzi, że tutaj pomaga, to catch-exception; jednak od maja 2014 r. projekt wydaje się być w trybie konserwacji (przestarzały w Java 8), i podobnie jak w przypadku wyjątku catch-catch Mockito można manipulować tylko metodami innymi niż final.