2

我刚刚开始学习 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 子句存在于我的方法中?

4

1 回答 1

2

添加throws到方法声明中只是一个警告标签,说“看,我可以随时抛出这个异常!你最好做好准备。” throw只有在使用语句或调用的方法使用语句时才会真正引发异常throw

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

您不需要测试一个方法是否有一个可以抛出的已检查异常——只需要测试它是否真的抛出了异常。实际上,正如您已经拥有的那样,expected参数 of@Test意味着如果您的方法停止抛出a NumberFormatException,则测试将失败,例如如果您将行更改为:

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

如果您觉得异常是“预期的”,以至于使用您的方法的人必须有一个 try/catch 块围绕它,您应该创建自己的子类 --Exception但请注意,这可能会使您的方法更难以干净地使用.

于 2012-10-16T01:20:27.963 回答