繁体   English   中英

JUnit4预期异常

[英]JUnit4 expected exception

我正在使用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);
}

第二次测试失败了。

考虑:

@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

JUnit4的行为与预期一致:抛出异常时,执行不会继续。 因此抛出NullPointerException ,测试方法退出,JUnit4将其标记为传递,因为您预期会发生异常。 null解除引用后的代码实际上不存在。

如果你想要第二次测试的行为,那么你所写的是一个很好的解决方案。 但这是一件奇怪的事情。 在我看来,你正在混淆两种不同的测试。 一个测试应该测试在特殊情况下抛出异常。 第二个测试应测试第二个断言检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM