异常

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

注意:有些人认为在单元测试中测试多个案例是不好的做法。