异常
JUnit 还可用于测试方法是否为给定输入抛出特定异常。
在这个例子中,如果布尔格式(输入)未被识别/未知,我们将测试以下方法是否真的抛出异常:
public static boolean parseBoolean(@NonNull String raw) throws IllegalArgumentException{
raw = raw.toLowerCase().trim();
switch (raw) {
case "t": case "yes": case "1": case "true":
return true;
case "f": case "no": case "0": case "false":
return false;
default:
throw new IllegalArgumentException("Unknown boolean format: " + raw);
}
}
通过将 expected
参数添加到 @Test
注释,可以定义应该抛出哪个异常。如果未发生此异常,则单元测试将失败,如果确实抛出异常,则单元测试将成功:
@Test(expected = IllegalArgumentException.class)
public void parseBoolean_parsesInvalidFormat_throwsException(){
StringUtilities.parseBoolean("Hello JUnit");
}
这很好用,但它确实限制了方法中的单个测试用例。有时你可能希望在单个方法中测试多个案例。通常用于克服此限制的技术是使用 try-catch
块和 Assert.fail()
方法:
@Test
public void parseBoolean_parsesInvalidFormats_throwsException(){
try {
StringUtilities.parseBoolean("Hello!");
fail("Expected IllegalArgumentException");
} catch(IllegalArgumentException e){
}
try {
StringUtilities.parseBoolean("JUnit!");
fail("Expected IllegalArgumentException");
} catch(IllegalArgumentException e){
}
}
注意:有些人认为在单元测试中测试多个案例是不好的做法。