如何在参数化测试中测试异常?
2022-09-01 22:04:50
在 JUnit4 中,您可以通过在一个方法中提供参数集合来编写参数化单元测试,这些参数集合将传递给测试的构造函数,并在另一个方法中进行测试。如果我有一个参数,我希望为其引发异常,我该如何指定?
在 JUnit4 中,您可以通过在一个方法中提供参数集合来编写参数化单元测试,这些参数集合将传递给测试的构造函数,并在另一个方法中进行测试。如果我有一个参数,我希望为其引发异常,我该如何指定?
这就是我使用 junit 参数化测试的方式,并有预期的异常:
@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;
}
}
与其他建议相反,我不会在测试中引入任何类型的逻辑 - 即使是简单的ifs!
您应该有两种测试方法:
不确定 JUnit 及其基于构造函数的参数化测试是否能够做到这一点。可能您必须为此创建两个测试类。使用JUnit Params或TestNG,它们提供了更方便的解决方案。