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

jUnit测试用例应该在throws声明或try-catch块中处理默认异常吗

汪文光
2023-03-14

如果我为一个抛出一堆异常的函数编写测试用例,我应该在我的测试方法中为这些异常添加一个抛出声明,还是应该捕获每个单独的异常。正确的方法是什么?我相信try-catch是一个更好的方法,但是我应该在catch块中打印stacktrac吗?

例如,我有一个方法getGroups(String name),它抛出AuthenticationException。如果我编写一个测试用例来检查当name参数为null时是否抛出IllegalArgumentException,我该如何处理AuthenticationException?我是将其添加到抛出方法的一部分,还是将异常包含在try catch块中。

@Test
public void testGetGroupsWithNull() throws AuthenticationException {
 thrown.expect(IllegalArgumentException.class);
 getGroups(null);
}

在上面的测试用例中,我刚刚添加了一个throws AuthentiationException,但我想知道是否最好将异常包含在try-catch块中,以及捕获异常后我应该做什么。我可以打印堆栈跟踪。

我正在处理意外异常AuthenticationException,方法是不将其放在'throws'子句中,而是放在try/catch块中。

@Test
public void testGetGroupsWithNull() {
thrown.expect(IllegalArgumentException.class);
try {
  getGroups(null);
} catch(AuthenticationExcption e) {
  Assert.fail("Authentication Exception");
}
}

共有3个答案

余天宇
2023-03-14

注释更具交流性。

它在不强制读者阅读代码的情况下发出测试预期发生的信号。

任何单个测试都应该只期望抛出一个异常,因为每个测试都应该测试一个行为。单个行为只能引发一个异常。

如果抛出任何其他异常,则表明测试失败。当然,测试方法签名必须反映任何可能的已检查异常,调用同一方法的真实代码也是如此。

高森
2023-03-14

如果JUnit测试抛出一个意外的异常,它就会失败。这就是您想要的行为。因此,使用try/catch块是没有意义的。如果您期望出现异常,请使用预期异常规则(您显然从代码片段中了解到这一点)。但无论您是否期待,都不要使用try/catch。

这意味着如果您的异常是检查异常,您需要一个抛出子句。事实上,您经常需要在测试方法上使用抛出子句,即使您不期望抛出异常,只是因为您的测试调用了一个有时可以抛出检查异常的方法。我已经养成了在每个测试方法上编写抛出异常的习惯。没有理由不这样做;这只是少了一件需要担心的事情。

谭研
2023-03-14

JUnit在这里有一篇很棒的文章:https://github.com/junit-team/junit/wiki/Exception-testing在这个问题上。你可以做:

@Test(expected= IndexOutOfBoundsException.class) 
public void empty() { 
  new ArrayList<Object>().get(0); 
}

或:

@Test
  public void testExceptionMessage() {
      try {
          new ArrayList<Object>().get(0);
          fail("Expected an IndexOutOfBoundsException to be thrown");
      } catch (IndexOutOfBoundsException anIndexOutOfBoundsException) {
          assertThat(anIndexOutOfBoundsException.getMessage(), is("Index: 0, Size: 0"));
      }
  }
 类似资料:
  • 本文向大家介绍SQL Server 2005 中使用 Try Catch 处理异常,包括了SQL Server 2005 中使用 Try Catch 处理异常的使用技巧和注意事项,需要的朋友参考一下 TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能. * TRY 块 - 包含可能产生异常的

  • 我有一个包含两个方法的类,每个方法都有一个try-catch块来查找任何异常。 代码如下: 我提出了一个测试用例,使用Mokito来测试上述场景,但不知道如何进入上述的catch块 我试图提出一个NullPointerException,但catch块仍然没有出现在CodeOverage中(我假设它没有经过测试)。请帮我写一个Junit测试用例来输入异常。我对所有这些话题都很陌生。

  • 本文向大家介绍我们可以在Java中的另一个try catch块中声明一个try catch块吗?,包括了我们可以在Java中的另一个try catch块中声明一个try catch块吗?的使用技巧和注意事项,需要的朋友参考一下 是的,我们可以 在另一个try-catch块中声明一个try-catch块,这称为嵌套try-catch块。 嵌套的尝试捕获块 如果一个内部的try statemen牛逼没

  • 本文向大家介绍请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?相关面试题,主要包含被问及请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?时的应答技巧和注意事项,需要的朋友参考一下 考察点:异常 J

  • 问题内容: 在一个教程中,我发现 您的代码无法处理Unchecked Exception, 即我们不能使用块,示例是类似的异常,但是可以使用try / catch块处理这些异常。我认为我不清楚这个概念! 我也认为throw关键字只能与block.can一起使用吗? 问题答案: 已检查和未检查的异常之间的唯一区别是,必须使用捕获或在方法签名中声明 已 检查的异常,而对于未检查的异常,这是可选的。 您

  • C++ 异常处理用于错误检测函数无法处理错误的情况。这种函数抛出异常(throw an exception),但不能保证有相关的异常处理器。如果有,则异常处理器捕获和处理这个异常。如果没有该类异常相关的异常处理器,则程序终止。 程序员在try块中放上出错时产生异常的代码。try块后面是一个或几个catch块。每个catch块指定捕获和处理一种异常,而且每个catch块包含一个异常处理器。如果异常与