3

我正在为一个项目使用 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);
}

第二次测试如预期的那样失败。

4

2 回答 2

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 ExpectedExceptionto 是一个更好的选择。expected

于 2013-03-12T11:06:18.613 回答
3

JUnit4 的行为符合预期:当抛出异常时,执行不会继续。所以NullPointerException被抛出,测试方法退出,JUnit4 将它标记为通过,因为你期望一个异常。null 取消引用后的代码实际上不存在。

如果您想要第二次测试的行为,那么您所写的是一个很好的解决方案。但这是一件奇怪的事情。在我看来,您将两种不同的测试混为一谈。一项测试应该测试在异常情况下是否引发了异常。第二个测试应该测试第二个断言检查的任何内容。

于 2013-03-12T00:21:22.640 回答