我想知道如何为特定的异常断言编写测试?
例如(我的测试数据容器):
@Parameters(name = "{index}: {0} > {1} > {2} > {3} > {4}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{"1200", new byte[] {0x4B0}, "1200", 16, 2},
{"10", new byte[] {0x0A}, "10", 8, 1},
{"13544k0", new byte[] {0x0A}, "1200", 8, 1}, <== assert thrown exception
{"132111115516", new byte[] {0x0A}, "1200", 8, 1},<== assert thrown exception
});
}
是否可以使用此类容器数据来断言异常,或者我需要在具体测试方法中对情况进行建模?
答案 0 :(得分:6)
在JUnit 4.7之前,不可能使用这样的数据驱动测试,其中一些数据组合会产生异常而一些数据组合不会产生异常。
可以创建两个不同的数据驱动测试,其中一个组合中的所有组合都不会产生异常,而另一个组合中的所有组合都会产生异常。
将@Test(expected=YourException.class)
用于期望异常的测试,除非您需要额外的测试逻辑。 expected
注释参数不是很强大。
从4.7开始,@Rule
就是一个适合它的{{1}}。有关详细信息,请参阅@ eee的答案。
答案 1 :(得分:6)
您可以使用JUnit规则ExpectedException
,这是一个可运行的示例:
@RunWith(Parameterized.class)
public class MyParameterizedTest {
public class UnderTest {
public void execute(String input) {
if ("1".equals(input)) {
throw new RuntimeException();
}
}
}
@Rule
public ExpectedException expected = ExpectedException.none();
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{"1", RuntimeException.class},
{"2", null}
});
}
@Parameter(value = 0)
public String input;
@Parameter(value = 1)
public Class<Throwable> exceptionClass;
@Test
public void test() {
if (exceptionClass != null) {
expected.expect(exceptionClass);
}
UnderTest underTest = new UnderTest();
underTest.execute(input);
}
}
答案 2 :(得分:1)
你可以通过添加像@eee这样的附加参数来组合这两种情况但是它会给你的测试用例增加逻辑/复杂性并使它们不那么可读