【问题标题】:JUnit test passes whether I throw exception or not无论我是否抛出异常,JUnit 测试都通过
【发布时间】:2012-10-15 21:22:15
【问题描述】:

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

【问题讨论】:

  • 我在 netbeans 中使用 JUnit4。

标签: unit-testing testing exception-handling junit


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2014-12-07
    • 2020-08-18
    • 2010-12-22
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多