【问题标题】:JUnit continue to assert things after expected exceptionJUnit 在预期异常后继续断言事物
【发布时间】:2014-02-02 01:46:53
【问题描述】:

我有类似的东西

@Test(expected = IllegalArgumentException.class)
public void cdIntoNonExistantFolder() {
    cdTool.changeDirectory("nonexistant");
    assertThat(cdTool.getStatusCode(), not(equalTo(0)));
}

我相信assertThat 不会运行,因为changeDirectory 会抛出异常。是否有可能让它仍然运行?

【问题讨论】:

  • 所以cdTool 抛出异常设置状态?为什么?

标签: java exception junit


【解决方案1】:

你可以使用finally:

@Test(expected = IllegalArgumentException.class)
public void cdIntoNonExistantFolder() {
    try {
        cdTool.changeDirectory("nonexistant");
    }
    finally {
        assertThat(cdTool.getStatusCode(), not(equalTo(0)));
    }
}

【讨论】:

    【解决方案2】:

    我宁愿避免在单元测试中使用任何 try/catch 结构。这是Catch-Exception 的一种可能性:

    @Test
    public void cdIntoNonExistantFolder() {
        catchException(cdTool).changeDirectory("nonexistant");
    
        assertThat(caughtException(), instanceOf(IllegalArgumentException.class));
        assertThat(cdTool.getStatusCode(), not(equalTo(0)));
    }
    

    或使用 JUnit 5:

    @Test
    public void cdIntoNonExistantFolder() {
        expectThrows(IllegalArgumentException.class, () -> {
            cdTool.changeDirectory("nonexistant");
        });
    
        assertThat(cdTool.getStatusCode(), not(equalTo(0)));
    }
    

    【讨论】:

      【解决方案3】:

      我更喜欢避免使用预期的异常注释。原因通常是在测试的“行为”部分之前有“安排”语句。这些“排列”部分可能会引发预期的异常,并且测试会以误报通过。

      相反,我会在被测方法周围使用 try/catch 结构。

      @Test
      public void cdIntoNonExistantFolder() {
          try {
              cdTool.changeDirectory("nonexistant");
              Assert.fail("Should have thrown IllegalArgumentException");
          }
          catch (IllegalArgumentException e) {
              Assert.assertTrue(true);
              assertThat(cdTool.getStatusCode(), not(equalTo(0)));
          }
      }
      

      需要注意的两点:

      1. try 块需要有一个 Assert.fail() 方法
      2. 我使用 Assert.assertTrue(true); catch 块中的语句以显示 这是预期的路径。

      【讨论】:

      • 您可以通过使用 ExpectedException 规则来避免误报,并且只有在您完成所有“安排”语句后才能设置。
      【解决方案4】:

      创建一个新方法,并将您的断言放入该方法,注释该方法@After

      @Test(expected = IllegalArgumentException.class)
      public void cdIntoNonExistantFolder() {
          cdTool.changeDirectory("nonexistant");
      }
      
      @After
      public void after() {
          assertThat(cdTool.getStatusCode(), not(equalTo(0)));
      }
      

      【讨论】:

      • after 注释应该包含测试类中的全部或至少大部分测试所需的代码。
      • 您不想编写赋予全局效果的代码。
      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 2018-11-21
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多