当前位置: 首页 > 知识库问答 >
问题:

Try Catch block工作但test assertThrows失败(JUnit5)

柳胡媚
2023-03-14

我正在尝试学习这篇教程JUnit 5:如何断言一个异常被抛出?

我使用Java10、IntelliJ2018和JUnit5。

public class Calculator {
    public static int[] calculate (int firstNumerator, int firstDenominator, int secondNumerator, int secondDenominator) {

        String exceptionMessage = "Undefined Math Expression";
        int resultNumerator;
        int resultDenominator;
        int[] result = new int[2];

        resultNumerator =  (firstNumerator * secondDenominator) +
                (secondNumerator * firstDenominator);
        resultDenominator = firstDenominator * secondDenominator;

        try {
            if (resultDenominator == 0) {
                  throw (new Throwable(exceptionMessage));
            } else {
                result[0] = resultNumerator;
                result[1] = resultDenominator;
            }
        } catch (Throwable e) {
           System.out.println(e.getMessage());
        }

        return result;
    }
}

测试

class CalculatorTest {
    @Test
    void denominatorContainsZero() {
        assertThrows(Throwable.class, () -> {
            Calculator.calculate(0,0,0,0);
        });
    }
}

共有1个答案

云季萌
2023-03-14

这里的误解似乎在于JUnit实际上可以看到的东西。

JUnit并不神奇:它只是普通的旧Java。它不能看到你的方法内部来看到它们在做什么。它所能看到的就是任何其他代码在执行方法时所能看到的:返回值和未捕获的异常(以及该方法的任何副作用,如果它们对调用代码可见的话)。

这里的方法不是从调用方的角度抛出异常:在内部,它抛出了异常,但它捕获并处理它。

抛出一个异常然后自己捕获并处理它从来不是(*)正确的做法。有什么意义?您可以简单地做您所做的事情来处理它,而不引发异常。抛出异常的代价很高,因为需要捕获整个堆栈跟踪。

throwable从来不是(*)要抛出的正确异常。它是返回object的异常“等价物”:它不向调用方传递关于异常的类型信息,然后调用方要么必须做大量工作来尝试处理它;或者,更现实地说,应该自己传播。IllegalArgumentException是在这里抛出的正确异常,如果您实际上需要抛出(而不是捕获)一个异常。

throwable很少是正确的捕捉对象。throwableexceptionerror的超级类型,因此您可能会无意中捕获到error(如outofmemoryerror),它不应该被捕获,因为除了使程序崩溃之外,没有任何合理的操作可做。抓住你能抓住的最具体的类型;这也意味着您应该抛出您所能抛出的最具体的类型(或者,至少是一个适合于抽象的类型)。

(*)这与“OK,在有限的几种情况下可能是适当的”中的“绝不”相同。但除非你明白这些是什么,否则不要。

 类似资料:
  • 我们在客户端上安装了我们的根证书,https连接适用于。 但是如果我们尝试使用,它会失败: 证书在客户端上。见: 版本:PIP1.4。1.

  • 问题内容: 我在主软件包的一个目录下有一些文件: main.go config.go server.go 当我这样做时:“执行构建”程序将完美构建并运行良好。当我这样做时:“ go run main.go”失败了。 输出: 未定义的符号是结构,并且大写,因此应将其导出。 我的Go版本:go1.1.2 linux / amd64 问题答案: 这应该工作 Go run需要一个文件或多个文件,并且它仅合

  • 我已经查看了所有关于CORS错误的其他问题,但运气不好。我正在NuxtJS客户端应用程序中发出一个简单的POST请求。如果我使用axios,我会得到CORS错误,但如果我使用fetch,它工作得很好。我想使用axios,但我无法解决这个问题。服务器设置了正确的“Access Control Allow Origin”标头(删除该标头时,以下两个选项都不起作用)。有人知道为什么fetch可以工作,但

  • 我对Jest是新手,目前只是在玩一些现有功能的测试。我有一个函数,它获取一个数据数组(来自JSON文件),并将其映射到特定的位置,绘制点。 这是功能点: plotPoint将JSON数据作为参数。该函数之所以有效,是因为它在控制台中正确记录数据,而其他功能按预期工作。 但测试总是失败: 绘图点。测验js 返回此错误: 我认为可能函数是在jsonfile之前的测试中运行的。json已加载,因此我尝试

  • 我有一个JDK1.7项目,在我的maven repo中有一个本地jar的maven依赖项。 我无法使用Intellij构建项目,错误是找不到一个符号(该符号是一个从本地jar导入包的类) 但是我可以使用'mvn包‘成功地构建项目。 我花了很多时间寻找解决办法,我已经做了很多事情: 无效缓存 “mvn clean install”本地jar依赖项 在IntelliJ的maven配置中标记为“自动加载

  • Windows---------------: Linux---------- 那么,什么是主要的原因是这个问题,看起来一切都好从其他的选择 Apache Maven 3.6.0(97C98EC64A1FDFEE7767CE5FFB20918DA4F719F3;2018-10-24T14:41:47-04:00)Maven主页:/home/user/tools/Maven/apache-maven