0

我想在 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 时才有可能获得成功吗?

4

1 回答 1

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

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

于 2013-11-14T16:49:30.400 回答