JUnit 4:多次出现一个异常

时间:2018-01-03 11:21:28

标签: java exception junit expected-exception

我有以下代码:

@Test(expected = IllegalArgumentException.class)
public void failureTest()    {
    testedObject.supposedToFail("");
    testedObject.supposedToFail(null);
}

运行此功能时,我无法保证会使用IllegalArgumentException参数抛出null。实际上,每当JUnit遇到第一个异常时,它就会停止整个方法的运行。

考虑到我必须为这个类(~20)尝试的测试用例的数量,我怀疑编写20个方法,每个方法都期望一个特定的异常(通常是相同的,但是)会有效。

有没有办法尝试一次抛出特定异常的每个方法? (例如,使用我的样本,你会看到两种方法)

谢谢

3 个答案:

答案 0 :(得分:1)

我会使用辅助方法并以这种方式执行:

编辑:这不起作用,请参阅替代工作解决方案

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

@Test
public void myTest() {
    List<Object[]> paramsList = Arrays.asList(
        new Object[] {"", IllegalArgumentException.class},
        new Object[] {null, NullPointerException.class});
    paramsList.forEach(a -> assertExceptionForParam((String)a[0], (Class)a[1]));
}

private void assertExceptionForParam(String param, Class expectedExceptionClass) {
    thrown.expect(expectedExceptionClass);
    testedObject.supposedToFail(param);
}

替代工作解决方案,MIRZAK评论后的变更

我的解决方案似乎实际上只测试列表中的第一个案例。这是一个可以测试它们的工作版本

@Test
public void myTest() {
    List<Object[]> paramsList = Arrays.asList(
        new Object[] {null, NullPointerException.class},
        new Object[] {"", IllegalArgumentException.class},
        new Object[] {"zip", NullPointerException.class});
    paramsList.forEach(a -> assertExceptionForParam((String)a[0], (Class)a[1]));
}

private void assertExceptionForParam(String param, Class expectedExceptionClass) {
    boolean pass = false;
    try {
        testedObject.supposedToFail(param);
    } catch(Exception e) {
        pass = e.getClass() == expectedExceptionClass;
    }
    Assert.assertTrue("test failed for param:" + param + " and Exception "+expectedExceptionClass, pass);
}

按预期输出:

java.lang.AssertionError: test failed for param:zip and Exception class java.lang.NullPointerException

答案 1 :(得分:0)

不幸的是,在这种情况下,辅助方法将不起作用,因为即使只有一个辅助方法调用抛出异常,@ Test方法也会通过。

我没有找到一种完美的方法来实施这种测试并最终得到如下结果:

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

@Test
public void testThrowIllegalArgumentExceptionForEmptyParam() {
    assertExceptionForParam("", IllegalArgumentException.class);
}

@Test
public void testThrowNullPointerExceptionForNullParam() {
    assertExceptionForParam(null, NullPointerException.class);
}

private void assertExceptionForParam(String param, Class expectedExceptionClass) {
    thrown.expect(expectedExceptionClass);
    testedObject.supposedToFail(param);
}

万一测试失败,您将清楚地了解它在何时何地失败,并且您的代码不会包含很多样板。

答案 2 :(得分:-1)

注意,这不是junit的解决方案,但让我分享一下如何在spock上实现相同的测试:

def "supposedToFail(String) throws IllegalArgumentException when the given argument is null or blank"() {
    when:
    testedObject.supposedToFail(givenArgument)

    then:
    thrown(IllegalArgumentException)

    where:
    givenArgument << [null, '', '       ', '\n']
}

Spock可以与junit一起在您的Java项目中使用而没有任何问题。