unit-testing - 无论我是否抛出异常,JUnit 测试都会通过

标签 unit-testing testing exception 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;
}

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

最佳答案

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

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

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

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

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

关于unit-testing - 无论我是否抛出异常,JUnit 测试都会通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904224/

相关文章:

java - 将双列表转换为分组字符串

java - 捕获可抛出的错误

reactjs - 如何使用 Jest 和 Enzyme(useField Hook)为 Formik 驱动的输入组件编写测试?

javascript - jasmine/sinon 有没有办法 stub 嵌套函数调用?

c# - 如何测试 API

ruby-on-rails - rails 4 : Syntax for testing partials

python - Python模块单元测试的最佳文件结构组织?

Angular Testing - 使用 rxjs switchMap 的链式 HTTP 请求

python - 如何在 Python 中捕获自定义异常

c# 异常抛出在(不在)构造函数中