我正在用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);
}第二个测试如预期的那样失败。
发布于 2013-03-12 19:06:19
考虑一下:
@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更好的选择。
发布于 2013-03-12 08:21:23
JUnit4的行为符合预期:当抛出异常时,执行不会继续。因此抛出NullPointerException,退出测试方法,JUnit4将其标记为通过,因为您预期会出现异常。空解引用后的代码实际上并不存在。
如果你想要第二个测试的行为,那么你所写的就是一个很好的解决方案。但这是一件很奇怪的事情。在我看来,你把两个不同的测试混在一起了。一个测试应该测试异常是否在异常情况下抛出。第二个测试应该测试第二个断言检查的内容。
https://stackoverflow.com/questions/15351015
复制相似问题