我正在使用JUnit4为项目进行场景测试。
在其中一个测试中,我需要检查预期的异常。使用JUnit4,我使用注释完成此操作。
@Test(expected=...)
现在的问题是,在测试中抛出异常的代码下面还有一些我需要检查的其他注释哪些不会被激活。举个例子:
@Test(expected=NullPointerException.class)
public void nullPointerTest() {
Object o = null;
o.toString();
assertTrue(false);
}
这个测试通过是因为它获得了nullpointerexception,但是asserTrue(false)显然存在断言错误,因此我希望它失败。
解决此问题的最佳方法是什么?解决方法可能如下,但我不知道这是否是正确的方法。
@Test
public void nullPointerTest2() {
boolean caught = false;
try{
Object o = null;
o.toString();
}
catch(NullPointerException e)
{
caught = true;
}
assertTrue(caught);
assertTrue(false);
}
第二次测试失败了。
答案 0 :(得分:4)
考虑:
@Test(expected=NullPointerException.class)
public void nullPointerTest2() {
boolean caught = false;
try{
Object o = null;
o.toString();
}
catch(NullPointerException e)
{
// test other stuff here
throw e;
}
}
这允许进行额外的检查,同时仍然充分利用JUnit的内置异常检查。
此外,我认为@Rule ExpectedException
在expected
的许多情况下更适合使用{{1}}。
答案 1 :(得分:3)
JUnit4的行为符合预期:当抛出异常时,执行不会继续。因此,NullPointerException
被抛出,测试方法退出,JUnit4将其标记为传递,因为您预期会发生异常。空取消引用后的代码实际上不存在。
如果你想要第二次测试的行为,那么你所写的是一个很好的解决方案。但这是一件奇怪的事情。在我看来,你正在混淆两种不同的测试。一个测试应该测试在特殊情况下抛出异常。第二个测试应该测试第二个断言检查。