当抛出异常和执行无异常时,如何使JUnit通过?

时间:2018-12-05 14:27:30

标签: java exception junit

我知道一个简单的方法就是这样:

try {  
     //perform something you expect no exceptions  
} catch (Exception e) {  
    Assume.assumeTrue(e.getErrorMessage().equals("Expected Exception");  
}

是否存在其他更优雅的方法来使我的JUnit在抛出特定异常和根本没有抛出异常时都可以通过Exception.thrown传递? / p>

3 个答案:

答案 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)

简而言之,您不会在同一测试中这样做。

单元测试只能测试一件事,并且如果您再次运行它不做任何更改,则必须始终具有相同的结果。在您的情况下,它正在测试两种不同的结果,因此,如果失败,您将不知道出什么问题了。是在处理异常的代码部分还是没有得到异常的部分中的错误?甚至更糟的是,如果它通过了,您只测试了两件事之一,而另一件事可能坏了,您将找不到答案!

您应该做的是将其分成两个测试。对引发异常的情况进行一项测试。您需要确保在这里抛出异常

另一个测试应该用于不引发异常的情况。您需要确保该异常不会抛出