我在可执行JAR文件中有一个简单的类:
public final class Main {
public static void main(String[] args) {
System.out.println("hello, world!");
System.exit(-1);
}
}
现在我正在尝试测试这个类/方法:
public class MainTest {
@Test public void testMain() {
Main.main(new String[] { "something" });
}
}
在System.exit(0)
上测试崩溃,我明白为什么。那我该怎么办?我要嘲笑System
吗?这里的标准方法是什么?顺便说一句,也许我应该测试“在容器中”的方法(在“JAR”中读取),就像我们用WAR文件做的那样?
答案 0 :(得分:1)
使用AspectJ around advice可能会在这里工作,因为您可以拦截对System.exit
的调用。
答案 1 :(得分:1)
使用不允许虚拟机exit
终止的安全警察或安全管理器。
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
throw new AccessControlException("exit not allowed during testing");
}
});
可能的缺点是对exit
的调用会抛出异常,
有关详细信息,请参阅java.lang.SecurityManager和Permissions in the JDK。
(我不喜欢调用exit
的想法 - 这是一种阻止虚拟机的苛刻方法。)
答案 2 :(得分:0)
你的主要不应该调用System.exit(0);如果没有,那就不会有任何区别,除非你可以在测试中调用它。
或者你不应该测试主要,因为你实际上没有检查它做什么。
编辑:过去我已经建议使用SecurityManager来阻止System.exit()关闭单元测试。但是,在过去几年中,我确保不使用System.exit()有很多原因,包括这个原因。