问题描述
我该如何处理是安装一个安全管理器,该安全管理器在调用System.exit时会引发异常。然后是捕获异常且不会使测试失败的代码。
public class NoExitSecurityManager
extends java.rmi.RMISecurityManager
{
private final SecurityManager parent;
public NoExitSecurityManager(final SecurityManager manager)
{
parent = manager;
}
public void checkExit(int status)
{
throw new AttemptToExitException(status);
}
public void checkPermission(Permission perm)
{
}
}
然后在代码中,如下所示:
catch(final Throwable ex)
{
final Throwable cause;
if(ex.getCause() == null)
{
cause = ex;
}
else
{
cause = ex.getCause();
}
if(cause instanceof AttemptToExitException)
{
status = ((AttemptToExitException)cause).getStatus();
}
else
{
throw cause;
}
}
assertEquals("System.exit must be called with the value of " + expectedStatus, expectedStatus, status);
解决方法
我正在为现有的Java
Swing应用程序执行一些测试,以便可以安全地重构和扩展代码而不会破坏任何内容。我从JUnit中的一些单元测试开始,因为这似乎是最简单的入门方法,但是现在我的首要任务是创建一些端到端测试,以对整个应用程序进行练习。
我将每种测试方法放在一个单独的测试用例中,并fork="yes"
在Ant的junit
任务中使用该选项,从而在每个测试中重新启动应用程序。但是,我想作为测试实现的一些用例涉及用户退出应用程序,这导致调用System.exit(0)的方法之一。JUnit将此视为错误:junit.framework.AssertionFailedError:
Forked Java VM exited abnormally
。
有没有办法告诉JUnit以零返回码退出实际上是可以的?