我有类似
的东西@Test(expected = IllegalArgumentException.class)
public void cdIntoNonExistantFolder() {
cdTool.changeDirectory("nonexistant");
assertThat(cdTool.getStatusCode(), not(equalTo(0)));
}
我认为assertThat
没有运行,因为changeDirectory
会抛出异常。是否有可能使它仍然运行?
答案 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)));
}
}
有两点需要注意:
答案 3 :(得分:-4)
创建一个新方法,并将断言放在该方法中,注释该方法@After
@Test(expected = IllegalArgumentException.class)
public void cdIntoNonExistantFolder() {
cdTool.changeDirectory("nonexistant");
}
@After
public void after() {
assertThat(cdTool.getStatusCode(), not(equalTo(0)));
}