JUnit在预期的异常后继续断言

时间:2014-02-02 01:46:54

标签: java exception junit

我有类似

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

我认为assertThat没有运行,因为changeDirectory会抛出异常。是否有可能使它仍然运行?

4 个答案:

答案 0 :(得分:11)

您可以使用finally

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

答案 1 :(得分:6)

我宁愿避免单元测试中的任何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)));
}

答案 2 :(得分:2)

我更喜欢避免使用预期的异常注释。原因通常是在测试的“行为”部分之前有“安排”声明。这些“安排”部分可能抛出预期的异常,测试将以误报传递。

相反,我会在被测方法周围使用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 block NEEDS有一个Assert.fail()方法
  2. 我使用Assert.assertTrue(true); catch块中的语句显示 这是预期的路径。

答案 3 :(得分:-4)

创建一个新方法,并将断言放在该方法中,注释该方法@After

@Test(expected = IllegalArgumentException.class)
public void cdIntoNonExistantFolder() {
    cdTool.changeDirectory("nonexistant");
}

@After
public void after() {
    assertThat(cdTool.getStatusCode(), not(equalTo(0)));
}