2010-11-11 5 views

Antwort

4
if (parameter == EXCEPTION_EXPECTED) { 
    try { 
     method(parameter); 
     fail("didn't throw an exception!"); 
    } catch (ExpectedException ee) { 
     // Test succeded! 
    } 
} 
+2

ich für eine vernünftige Lösung gehofft - z.B. etwas wie mehrere @Parameters-Methoden mit optional erwartetem Annotationsargument, aber ich denke, so etwas ist kein Teil des Frameworks. Trotzdem danke. –

0

Wenn Sie catch-exception anstelle der entsprechenden Anmerkungen und Regeln von JUnit4 verwendet, dann wird Ihr Code würde wie folgt aussehen:

catchException(obj).method(parameter); 

if (parameter != EXCEPTION_EXPECTED) { 
    assert caughtException() instanceof ExpectedException; 
} 
// more assertions 
5

Im Gegensatz zu den anderen vorschlagen, würde ich nicht jede Art von einführen Logik zu Tests - auch einfache Wenns!

Was sollten Sie haben zwei Testmethoden:

  • erste gültigen Parameter übernimmt (und erwartet eine Ausgabe)
  • Sekunden nehmen ungültige Parameter (und erwarten Ausnahmen)

Nicht sicher wenn JUnit mit seinem erbauerbasierten parametrisierten Test dazu in der Lage ist. Wahrscheinlich müssten Sie dafür zwei Testklassen erstellen. Gehen Sie mit JUnit Params oder TestNG, die viel bequemere Lösung bieten.

1

Gabriel, bitte sehen Sie sich die TestWatcher-Regel an (seit JUnit 4.9). Hier ist der Beispielcode aus http://junit-team.github.io/junit/javadoc/4.11/org/junit/rules/TestWatcher.html zitiert:

public static class WatchmanTest { 
    private static String watchedLog; 

    @Rule 
    public TestWatcher watchman= new TestWatcher() { 
     @Override 
     protected void failed(Throwable e, Description description) { 
      watchedLog+= description + "\n"; 
     } 

     @Override 
     protected void succeeded(Description description) { 
      watchedLog+= description + " " + "success!\n"; 
     } 
    }; 


    @Test 
    public void fails() { 
     fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 
} 

Ein anderer Ansatz ErrorCollector von JUnit 4.7 zu verwenden wäre: @Rule öffentliche ExpectedException geworfen = ExpectedException.none();

@Test 
public void testCollectingErrors() { 
    thrown.handleAssertionErrors(); 
    thrown.expect(MultipleFailureException.class); // or #expectMessage()/#expectCause() 

    collector.checkThat("a", equalTo("b")); 
    //... 
} 
13

dies ist, wie ich junit parametrisierte Test mit erwarteten Ausnahmen verwenden:

@RunWith(Parameterized.class) 
public class CalcDivTest { 

@Parameter(0) 
public int num1; 
@Parameter(1) 
public int num2; 

@Parameter(2) 
public int expectedResult; 

@Parameter(3) 
public Class<? extends Exception> expectedException; 
@Parameter(4) 
public String expectedExceptionMsg; 

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

@Parameters 
public static Iterable<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
     // calculation scenarios: 
     { 120, 10, 12, null, null }, // simple div 
     { 120, 0, -1, ArithmeticException.class, "/ by zero" }, // div by zero   
    }); 

} 

@Test 
public void testDiv() throws CCalculationException { 

    //setup expected exception 
    if (expectedException != null) { 
     thrown.expect(expectedException); 
     thrown.expectMessage(expectedExceptionMsg); 
    } 

    assertEquals("calculation result is not as", expectedResult, div(num1, num2)); 

} 

private int div(int a, int b) { 
    return a/b; 
} 
} 
Verwandte Themen