如何解决Java:如何测试调用 System.exit() 的方法?
事实上,Derkeiler.com建议:
- 为什么
System.exit()
?
与其以 System.exit(whateverValue) 终止,不如抛出一个未经检查的异常?在正常使用中,它会一直漂移到 JVM 的最后一搏捕手并关闭您的脚本(除非您决定在途中的某个地方捕获它,这可能在某天有用)。
在 JUnit 场景中,它将被 JUnit 框架捕获,该框架将报告某某测试失败并顺利进行下一个测试。
尝试修改 TestCase 以使用阻止调用 System.exit 的安全管理器运行,然后捕获 SecurityException。
public class NoExitTestCase extends TestCase
{
protected static class ExitException extends SecurityException
{
public final int status;
public ExitException(int status)
{
super("There is no escape!");
this.status = status;
}
}
private static class NoExitSecurityManager extends SecurityManager
{
@Override
public void checkPermission(Permission perm)
{
// allow anything.
}
@Override
public void checkPermission(Permission perm, Object context)
{
// allow anything.
}
@Override
public void checkExit(int status)
{
super.checkExit(status);
throw new ExitException(status);
}
}
@Override
protected void setUp() throws Exception
{
super.setUp();
System.setSecurityManager(new NoExitSecurityManager());
}
@Override
protected void tearDown() throws Exception
{
System.setSecurityManager(null); // or save and restore original
super.tearDown();
}
public void testNoExit() throws Exception
{
System.out.println("Printing works");
}
public void testExit() throws Exception
{
try
{
System.exit(42);
} catch (ExitException e)
{
assertEquals("Exit status", 42, e.status);
}
}
}
2012 年 12 月更新:
在评论中建议使用](http://stefanbirkner.github.com/system-rules/) ,这是一组用于测试代码的
JUnit(4.9+) 规则,其中使用java.lang.System
. 在2011 年 12
月的回答
中 最初提到了这一点。 **
System.exit(…)
使用
ExpectedSystemExit
规则来验证是否System.exit(鈥�)
被调用。 您也可以验证退出状态。
例如:
public void MyTest {
@Rule
public final ExpectedSystemExit exit = ExpectedSystemExit.none();
@Test
public void noSystemExit() {
//passes
}
@Test
public void systemExitWithArbitraryStatusCode() {
exit.expectSystemExit();
System.exit(0);
}
@Test
public void systemExitWithSelectedStatusCode0() {
exit.expectSystemExitWithStatus(0);
System.exit(0);
}
}
解决方法
我有一些方法应该调用System.exit()
某些输入。不幸的是,测试这些情况会导致 JUnit
终止!将方法调用放在新线程中似乎没有帮助,因为System.exit()
终止了
JVM,而不仅仅是当前线程。是否有任何常见的模式来处理这个问题?例如,我可以用存根代替System.exit()
吗?
[编辑] 有问题的类实际上是一个命令行工具,我试图在 JUnit 中进行测试。也许 JUnit
根本就不是适合这项工作的工具?欢迎提出补充回归测试工具的建议(最好是与 JUnit 和 EclEmma 很好集成的工具)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。