JUnit测试通过我是否抛出异常

时间:2012-10-15 21:22:16

标签: unit-testing testing exception-handling junit

我刚开始学习JUnit。我试着在别处寻找这个答案,但我找不到它。假设我编写了一个期望异常的JUnit测试方法,如下所示:(数学是我写的类的实例)

 @Test(expected = NumberFormatException.class)
    public void testAdd_String() {
        System.out.println("testing add number to string");
        double result = math.add("lakd", "2");
    }

现在我想测试的方法:

public double add(String operand1, String operand2) {
    int num1 = Integer.parseInt(operand1);
    int num2 = Integer.parseInt(operand2);
    return num1 + num2;
}

当我在方法标题上有throws NumberFormatException时,以及当它没有时,我的测试都通过了。这是预期的行为还是JUnit?有没有办法通过JUnit测试来确保我的方法中存在throws子句?

1 个答案:

答案 0 :(得分:2)

throws添加到方法声明只是一个警告标签,说“看,我可以随时抛出此异常!你最好为此做好准备。”您只在实际使用throw语句时抛出异常,或者您调用的方法使用throw语句。

NumberFormatException运行时异常未经检查的异常RuntimeException的子类),因此永远不需要在使用的方法上声明它throws。您仍然可以在try / catch块中捕获它,但与已检查的异常(例如FileNotFoundExceptionException的子类)不同,您不需要在其上声明它抛出它的方法。

您不应该测试某个方法是否具有可以抛出的已检查异常 - 只是它是否实际抛出异常。事实上,正如您已经拥有的那样,expected @Test参数意味着如果您的方法停止投掷 NumberFormatException,测试将失败,例如你改变了这一行:

double result = math.add("1", "2");

如果你觉得异常是“预期的”,那么使用你的方法的人必须有一个围绕它的try / catch块,你应该创建自己的Exception子类 - 但要预先警告这可能使你的方法更难以干净利用。