测试几行中抛出的异常

时间:2013-11-14 16:36:59

标签: junit4

我想在JUnit4中测试一个方法,它不会在第一个捕获的异常处传递,但是如果对测试方法的所有调用都抛出异常。我想知道这是否可能。

我解释一下:让我们说我有方法

public void setFromFen(String fenValue) throws IllegalArgumentException

在班级职位。

在PositionTest Junit4课程中,我想做类似的事情:

@Test(expected=IllegalArgumentException.class){
    ...
    setFromFen("2"); // throws IllegalArgumentException
    setFromFen("8/8/8/8/8/8/8/8"); // does not throw IllegalArgumentException
    ...
}

这样只有在对setFromFen的所有调用都失败时,测试才会成功。

在这种情况下,虽然第二个测试没有抛出IllegalArgumentException,但测试成功了:这不是我想要的。

只有当所有测试行都抛出IllegalArgumentException时才能获得成功吗?

1 个答案:

答案 0 :(得分:1)

我认为这超出了注释的可能性。 你可能需要这些内容:

@Test
public void thatAllCallsFail() {
    int failureCount = 0;
    try {
        setFromFen(this.sampleString1);
    }
    catch( final Exception e ) {
        failureCount++;
    }
    try {
        setFromFen(this.sampleString1);
    }
    catch( final Exception e ) {
        failureCount++;
        assertEquals("All 2 calls should have failed", failureCount, 2);
    }
}

我不是第二次暗示这是一种很好的方式。

如果您正在寻找更通用的解决方案,可能需要将字符串添加到集合中并循环遍历它们......

@Test
public void thatAllCallsFail2() {
    final String[] strings = new String[] { sampleString1, sampleString2 };
    int failureCount = 0;

    for (final String string : strings) {
        try {
            setFromFen(string);
        }
        catch( final Exception e ) {
            failureCount++;
        }
    }

    assertEquals("All " + strings.length + " calls should have failed", failureCount, strings.length);
}

当然,如果测试失败,这些解决方案都不会告诉您哪个调用没有抛出异常。