我知道一个简单的方法就是这样:
try {
//perform something you expect no exceptions
} catch (Exception e) {
Assume.assumeTrue(e.getErrorMessage().equals("Expected Exception");
}
是否存在其他更优雅的方法来使我的JUnit在抛出特定异常和根本没有抛出异常时都可以通过Exception.thrown传递? / p>
答案 0 :(得分:6)
我相信单元测试应该有一个确定的结果,而不应该有多个结果。
您始终可以嘲笑可能影响测试结果的外部依赖关系。 单元测试的最佳实践之一是测试必须是“可重复的”。
运行单元测试应该与它的结果一致,也就是说,如果您在两次运行之间不做任何更改,它将始终返回相同的结果。
很多开发人员都遵循的一种惯例/规则是每个测试仅包含一个断言。
因此,也许最好的解决方案是尝试使您的测试“可重复”。
希望这会有所帮助,欢呼
答案 1 :(得分:2)
是的
@Test(expected=ExceptionType.class)
public void runTest(){
// your code here
}
或者,如果您想进一步检查异常,请ExpectedException。
@Rule ExpectedException exception= ExpectedException.none();
@Test
public void runTest(){
// your code here
exception.expect(NullPointerException.class);
exception.expectMessage("your expected Message");
}
编辑:
两个版本实际上都需要引发异常;如果您想在两种情况下都通过测试,可以编写自己的Rule
。但是,这样的测试没有什么意义。
答案 2 :(得分:1)
简而言之,您不会在同一测试中这样做。
单元测试只能测试一件事,并且如果您再次运行它不做任何更改,则必须始终具有相同的结果。在您的情况下,它正在测试两种不同的结果,因此,如果失败,您将不知道出什么问题了。是在处理异常的代码部分还是没有得到异常的部分中的错误?甚至更糟的是,如果它通过了,您只测试了两件事之一,而另一件事可能坏了,您将找不到答案!
您应该做的是将其分成两个测试。对引发异常的情况进行一项测试。您需要确保在这里抛出异常 。
另一个测试应该用于不引发异常的情况。您需要确保该异常不会抛出 。