【问题标题】:Unit test Best Practices when testing Exceptions [closed]测试异常时的单元测试最佳实践[关闭]
【发布时间】:2019-10-11 08:42:41
【问题描述】:

所以我一直在对一个 android 应用程序进行单元测试,虽然我在某些情况下测试失败场景,但我并没有按照这个答案建议的方式(Try catch in a JUnit test)测试它们。

我按照下面代码中显示的方式对其进行测试。答案是建议您应该在测试方法签名上有“抛出异常”,因为如果它实际上抛出了您不期望的异常,它将无法通过测试。但是,我在有和没有这段代码的情况下都试过了,但它以同样的方式失败了。 上面提供的答案也使用我没有使用过的“规则”来处理这种测试,因为我需要的所有东西都放在我的 try catch 块中,并且实例化是在 @Before 方法中完成的。

@Test
public void testMethod() {
   try{
   //code that will throw exception
   fail("Exception was not thrown");
   } catch (/* types of exceptions */) {
   //my asserts
   }
}

我追求的是哪种方法被认为是“最佳实践”及其背后的原因。

【问题讨论】:

    标签: java android unit-testing junit4


    【解决方案1】:

    @Test 注释的 expected 属性用于定义检查是否引发特定异常的测试用例。或者,还有@Rules 注释用于更具体的控制和有点弃用的“try-catch”习语。有关示例,请参阅 thisjunit wiki

    @Test(expected = IllegalArgumentException.class)
    

    【讨论】:

    • 第一篇总结的挺好的,明确了“规则”的方式更适合我做的事情
    【解决方案2】:

    我个人使用 assertThrows 并将结果分配给 Throwable,以便我可以检查消息。 这样做的原因是,例如,当我需要检查返回 IllegalArgument 的验证时,我可以检查该消息是否是缺少该字段的预期消息。

    @Test
    public void testSomething_shouldThrowException() {
    
      String expectedMessage = "Exception running the method";
    
      Throwable exception = Assertions.assertThrows(YourException.class, () 
        -> {
          bean.doSomething(dummyRequest);
        });
    
      Assert.assertEquals(expectedMessage, exception.getMessage());
    }
    

    【讨论】:

      【解决方案3】:

      由于这是用 JUnit4 标记的,所以我更喜欢使用 @Test 注释的预期属性

      @Test(expected = NullPointerException.class)
      

      但是,如果你需要进一步检查抛出的异常的属性,你可以使用 ExpectedException,它非常强大:

      @Rule
      public ExpectedException exceptionRule = ExpectedException.none();
      
      @Test
      public void whenExceptionThrown_thenRuleIsApplied() {
          exceptionRule.expect(NumberFormatException.class);
          exceptionRule.expectMessage("For input string");
          Integer.parseInt("1a");
      }
      

      不过,我建议使用 JUnit 5,您可以在其中使用 Java 8 构造,例如传递一个 Lambda 进行检查,这使您的代码非常具有声明性和简洁性。

      JUnit 4 和 JUnit 5 的好文章:https://www.baeldung.com/junit-assert-exception

      【讨论】:

      • 感谢您对 junit5 的建议并介绍其功能。不过现在我将使用junit 4。
      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多