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

如何测试是否没有抛出异常?

李光华
2023-03-14

我知道一种方法是:

@Test
public void foo() {
   try {
      // execute code that you expect not to throw Exceptions.
   } catch(Exception e) {
      fail("Should not have thrown any exception");
   }
}

有什么更干净的方法吗?(可能使用JUnit的@rule?)

共有1个答案

法池暝
2023-03-14

你这样做是不对的。只需测试您的功能:如果抛出异常,测试将自动失败。如果没有抛出异常,您的测试将全部变为绿色。

我注意到这个问题不时引起人们的兴趣,所以我会稍微扩展一下。

当您进行单元测试时,向自己定义您所认为的工作单元是很重要的。基本上:对代码库的提取,它可能包含也可能不包含表示单个功能的多个方法或类。

null

null

null

null

第一个工作单元应测试在有效和无效输入的情况下是否返回了有效用户。
必须在此处处理数据源引发的任何异常:如果没有用户存在,则应进行一个测试,说明在找不到用户时引发了异常。这方面的一个示例可以是IllegalArgumentException,它是用@test(expected=IllegalArgumentException.class)批注捕获的。

一旦您处理了这个基本工作单元的所有使用,您就可以提升一个级别。在这里,您做了完全相同的操作,但您只处理来自当前级别下的异常。这使您的测试代码保持良好的结构化,并允许您快速地运行体系结构以发现哪里出了问题,而不是必须到处跳。

在这一点上,我们应该清楚地知道我们将如何处理这些异常。输入有两种类型:有效输入和错误输入(输入在严格意义上是有效的,但不正确)。

null

这样的方法调用可以如下所示:existinguserbyid_shouldreturn_userobject。如果此方法失败(例如:抛出异常),那么您就知道出了问题,可以开始挖掘。

通过添加另一个使用错误输入并期望出现异常的测试(nonexistinguserbyid_shouldthrow_illegalargumentexception),您可以看到您的方法是否对错误输入执行了预期的操作。

您试图在测试中做两件事:检查有效输入和错误输入。通过将其拆分为两种方法,每种方法都做一件事,您将有更清晰的测试,并更好地了解哪里出了问题。

通过记住工作的分层单元,您还可以减少对层次结构中较高的一个层所需的测试量,因为您不必考虑在较低层中可能出错的所有事情:当前层下面的层实际上保证了您的依赖关系能够正常工作,如果出错,则是在当前层中(假设较低层本身没有抛出任何错误)。

 类似资料:
  • 我正在尝试测试当试图除以零时,是否会抛出带有定制消息的异常。 方法是这样的: 在搜索了一些解决方案后,我发现这是一种做这件事的方法,但是我的IDE不能识别“expected”... 我只是不知道为什么我的 IDE 无法识别“预期”。不知道这是否与 Junit 版本有关,或者我使用的语法是否存在问题。 在我迄今为止使用的所有其他测试中,我从未在@Test之后添加任何内容。我刚刚在另一个线程中找到了类

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?

  • 我有一个方法: 这是用户授权测试的样子: 有没有办法检查用户输入错误密码的情况?因为在我发送错误密码的情况下,它不起作用,因为 使在你检查密码之前返回结果。

  • 我有一个类,它有一个方法。我正在做相应的测试,但是我还不能验证是否抛出了定制的异常,我使用的是JUnit5。 我已经复习了这里,但答案并没有帮助我,这是我根据一个示例编写的代码:

  • 假设我有以下功能: 根据Jest文档,我应该能够使用以下代码测试函数是否引发异常: 但是,我得到了以下错误。 有人能告诉我我做错了什么吗? 谢谢!