如果代码中有异常,如何让Junit测试用例失败?

问题描述 投票:0回答:7

我编写了一个 Junit 测试来对我的代码进行单元测试。当我的代码中出现任何异常时,我希望我的 Junit 测试用例失败。我尝试使用断言语句,但即使我的代码中出现异常,我的 Junit 测试用例也会通过。请问谁能告诉我如何实现这一目标?谢谢。

java junit junit4
7个回答
43
投票

我强烈建议您只测试您的功能。如果抛出异常,测试将自动失败。如果没有抛出异常,您的测试将全部显示为绿色。

但是,如果您仍然想编写在出现异常时应该失败的测试代码,请执行以下操作:-

@Test
public void foo(){
   try{
      //execute code that you expect not to throw Exceptions.
   }
   catch(Exception e){
      fail("Should not have thrown any exception");
   }
}

8
投票

实际上,当代码中抛出异常时,您的测试应该失败。当然,如果您捕获此异常并且不进一步抛出它(或任何其他异常),测试将不会知道它。在这种情况下,您需要检查方法执行的结果。 测试示例:

@Test
public void test(){
  testClass.test();
}

测试失败的方法:

public void test(){
  throw new RuntimeException();
}

不会失败的方法

public void test(){
  try{
    throw new RuntimeException();
  } catch(Exception e){
    //log
  }
}

2
投票

如果不进一步编码,以下两个测试都会失败:

@Test
public void fail1() {
    throw new NullPointerException("Will fail");
}

@Test
public void fail2() throw IOException {
    throw new IOException("Will fail");
}

1
投票

在 JUnit 4 中,您可以使用

expected
注释的
@Test
属性显式断言 @Test 应因给定异常而失败:

  @Test(expected = NullPointerException.class)
  public void expectNPE {
     String s = null;
     s.toString();
  }

请参阅 JUnit4 文档


0
投票

您可以断言全局变量“excepted”= null 或类似的变量,并将其初始化为等于 catch 块中的某些信息字符串。


0
投票

用途: 最后根据需要断言或 Assert.assertTrue


0
投票

我们使用junit 4.12,也有同样的问题,任何抛出异常的测试都会被标记为通过,这看起来不合逻辑且危险。

各个论坛上有一些建议的解决方案,我在这里整理了一下。 大多数(对我们来说)不起作用。 需要将每个测试包装在 try/catch/fail 中的解决方案是唯一可行的解决方案,但如果您有数千个测试,则需要添加大量工作。

这是 Junit 5 的建议解决方案:

import org.junit.jupiter.api.Assertions;
public class NoExceptionTest {
    @Test
    public void testNoException() {
        assertDoesNotThrow(() -> {
            // code that is expected to not throw an exception
        });
    }
}

这是 Junit 4 的建议方法:

@Test(expected = NoException.class)
public void testMethod() {
    // Code that should not throw an exception goes here
}

上述内容对我们不起作用,因为我们无法解析 NoException.class

另一篇文章建议这样做:

@Rule
public ExpectedException exception = ExpectedException.none();

但这也不起作用。

@vinay 建议的这个解决方案有效,但需要包装每个测试,如果您有数千个测试,这是一项重要的任务。

@Test
public void foo(){
   try{
      //execute code that you expect not to throw Exceptions.
   }
   catch(Exception e){
      fail("Should not have thrown any exception");
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.