为了描述我遇到的问题,让我们假设有一个虚拟类:
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中抑制该错误?或者该问题的任何其他解决方法/解决方案?
答案 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
我认为解决这个问题是不可能的,它确实是核心行为。