我正在为现有的Java Swing应用程序实现一些测试,这样我就可以安全地重构和扩展代码,而不会破坏任何东西。我从JUnit中的一些单元测试开始,因为这似乎是最简单的入门方法,但现在我的首要任务是创建一些端到端测试来作为一个整体来测试应用程序。
我在每次测试中重新启动应用程序,将每个测试方法放在单独的测试用例中,并在Ant的junit任务中使用fork="yes"选项。但是,我希望作为测试实现的一些用例涉及用户退出应用程序,这会导致其中一个方法调用System.exit(0)。这被JUnit认为是一个错误:junit.framework.AssertionFailedError: Forked Java VM exited abnormally。
有没有办法告诉JUnit,退出时返回代码为零实际上是可以的?
发布于 2011-05-26 23:48:23
我如何处理这个问题是安装一个安全管理器,它在调用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);发布于 2011-12-29 00:36:06
库System Rules有一个名为ExpectedSystemExit的JUnit规则。使用此规则,您可以测试调用System.exit(...)的代码:
public class MyTest {
@Rule
public final ExpectedSystemExit exit = ExpectedSystemExit.none();
@Test
public void systemExitWithArbitraryStatusCode() {
exit.expectSystemExit();
/* the code under test, which calls System.exit(...)
* with an arbitrary status
*/
}
@Test
public void systemExitWithSelectedStatusCode0() {
exit.expectSystemExitWithStatus(0);
//the code under test, which calls System.exit(0)
}
}系统规则至少需要JUnit 4.9。
完全公开:我是系统规则的作者。
发布于 2011-05-26 23:44:07
您是否可以将“系统退出”抽象为一个新的依赖项,以便在您的测试中只有一个假的,它记录了exit已被调用的事实(以及值),但在实际应用程序中使用调用System.exit的实现?
https://stackoverflow.com/questions/6141252
复制相似问题