测试 java 程序是否调用 System.exist - 不退出 Junit
Testing if a java program calls System.exist - without exiting Junit
我正在尝试使用 Junit 测试文件处理程序。在某些情况下,程序应该打印错误并完成其 运行。但是,使用 "System.exit(-1)" 会导致程序退出整个 Junit 测试。
有什么办法可以避免吗?
我可以打印错误然后 return null
,但是我觉得它很不雅。
private List<String> parseData(String[] args){
if (args.length != 2){
System.err.println(ERROR + INPUT_ERROR + "\n");
System.exit(EXIT_CODE);
有没有办法在不关闭的情况下检查程序是否调用了"System.exit"?
谢谢。
我觉得用System.exit验证输入参数比较不雅。
为什么不抛出异常并让此方法的调用者处理它?
虽然我认为 AdrianM 的解决方案是理想的解决方案,但您也可以通过模拟来解决这个问题。
选项一:使用模拟框架,例如 PowerMock,它允许您模拟静态方法,这样您就可以让 System.exit
什么都不做。
选项二:使用依赖注入和任何模拟框架。创建此接口并实现 class:
public interface SystemExit {
void exit(int code);
}
public class SystemExitImpl implements SystemExit {
public void exit(int code) {
System.exit(code);
}
}
然后,让包含parseData
的class把一个SystemExit
作为构造函数的参数存入一个成员变量(或者有一个setter作为构造函数的参数)允许您在构造后设置它的成员变量)。在您的生产代码中,传递 SystemExitImpl
。在您的测试中,为 SystemExit
创建一个模拟并传递它。
我正在尝试使用 Junit 测试文件处理程序。在某些情况下,程序应该打印错误并完成其 运行。但是,使用 "System.exit(-1)" 会导致程序退出整个 Junit 测试。 有什么办法可以避免吗?
我可以打印错误然后 return null
,但是我觉得它很不雅。
private List<String> parseData(String[] args){
if (args.length != 2){
System.err.println(ERROR + INPUT_ERROR + "\n");
System.exit(EXIT_CODE);
有没有办法在不关闭的情况下检查程序是否调用了"System.exit"? 谢谢。
我觉得用System.exit验证输入参数比较不雅。 为什么不抛出异常并让此方法的调用者处理它?
虽然我认为 AdrianM 的解决方案是理想的解决方案,但您也可以通过模拟来解决这个问题。
选项一:使用模拟框架,例如 PowerMock,它允许您模拟静态方法,这样您就可以让 System.exit
什么都不做。
选项二:使用依赖注入和任何模拟框架。创建此接口并实现 class:
public interface SystemExit {
void exit(int code);
}
public class SystemExitImpl implements SystemExit {
public void exit(int code) {
System.exit(code);
}
}
然后,让包含parseData
的class把一个SystemExit
作为构造函数的参数存入一个成员变量(或者有一个setter作为构造函数的参数)允许您在构造后设置它的成员变量)。在您的生产代码中,传递 SystemExitImpl
。在您的测试中,为 SystemExit
创建一个模拟并传递它。