由于检查在一个junit测试中是否调用了System.exit(),Surefire失败了

时间:2014-07-30 10:03:25

标签: java groovy junit maven-surefire-plugin

为了描述我遇到的问题,让我们假设有一个虚拟类:

import static java.lang.System.exit
class Example {

  void methodGeneratingSystemExit1() {
  exit 1
  }

  void methodGeneratingSystemExit2() {
  exit 2
  }
}

对它进行测试:

import org.junit.Test
import org.junit.Rule
import org.junit.contrib.java.lang.system.ExpectedSystemExit
class ExampleTest {
@Rule
 public final ExpectedSystemExit expectedSystemExit = ExpectedSystemExit.none()

@Test
void "System exits with code 1 when method1 is generated"() {
expectedSystemExit.expectSystemExitWithStatus(1)
methodGeneratingSystemExit1()
}
@Test
void "System exits with code 1 when method1 is generated"() {
expectedSystemExit.expectSystemExitWithStatus(2)
methodGeneratingSystemExit2()
}


}

正如我所说,它只是一个虚拟的例子,但仍然测试做了所谓的o - 当调用System.exit()时,测试注意到并且都是绿色的。问题是,我有一个surefire插件给我一个消息,如:

  

错误]无法执行目标org.apache.maven.plugins:maven-surefire-plugin:2.17:test(default-test)on project xtrakter:执行default-test of goal org.apache.maven.plugins:maven -surefire-plugin:2.17:测试失败:分叉的VM在没有正确说再见的情况下终止。 VM崩溃或System.exit调用?

如何在surefire中抑制该错误?或者该问题的任何其他解决方法/解决方案?

2 个答案:

答案 0 :(得分:4)

您可以通过安装自己的SecurityManager来测试System.exit,在测试期间实施 checkExit 方法。有关详细信息,请参阅Java: How to test methods that call System.exit()?

答案 1 :(得分:2)

  

Surefire不支持任何时候测试或任何调用System.exit()的引用库。

来源:http://maven.apache.org/surefire/maven-surefire-plugin/faq.html#vm-termination

我认为解决这个问题是不可能的,它确实是核心行为。