我正在尝试单位测试一个参数为异常的函数。但是,似乎由于该功能仅引发异常并且不返回,所以我不能只喂食一个会引发异常的函数和参数。
我该如何处理?
您可以添加一个try-catch子句,并带有您期望被抛出的例外,在捕获子句中使用 pass
和一个 fail()
。>
主要的单元测试框架支持验证异常。
考虑此方法:
public boolean throwIfBlank(String input) {
if(input == null || input.trim().isEmpty()) {
throw new IllegalArgumentException("Input should not be blank.");
}
return true;
}
对于Junit 4,您可以使用@Test
注释的expected
属性来验证异常。如果异常是不是,则单位测试将失败。
// JUnit 4
@Test( expected = IllegalArgumentException.class )
public void testBlankStringThrowsException() {
classUnderTest.throwIfBlank("");
// test will automatically fail if exception is NOT thrown
}
同样,在junit 5中,您可以明确断言使用assertThrows
抛出的东西:
@Test
void testBlankStringThrowsException() {
assertThrows(IllegalArgumentException.class, () -> classUnderTest.throwIfBlank(""));
}
最后,TestNG的@Test
注释支持各种属性,以验证特定异常是抛出的:
@Test(
expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "Input should not be blank."
)
public void testBlankStringThrowsException {
classUnderTest.throwIfBlank("");
}
当然,您始终可以将测试方法包装在try-catch
块中,并在不抛出异常时明确调用fail()
;通常,这种老式的方法不需要,而是完整性:
@Test
public void testBlankStringThrowsException() {
try {
classUnderTest.throwIfBlank("");
fail("Blank string should have thrown an IllegalArgumentException!");
} catch (IllegalArgumentException e) {
// expected
} catch (Exception e) {
fail("Expected an IllegalArgumentException but threw: " + e);
}
}