1

我正在尝试使用 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”而不关闭它?谢谢你。

4

2 回答 2

4

我认为使用 System.exit 来验证输入参数更不优雅。为什么不直接抛出一个异常,让这个方法的调用者来处理呢?

于 2019-05-29T17:58:23.513 回答
1

虽然我认为 AdrianM 的解决方案是理想的解决方案,但您也可以通过模拟来解决这个问题。

选项一:使用诸如PowerMock之类的模拟框架,它可以让您模拟静态方法,这样您就可以System.exit什么都不做。

选项二:使用依赖注入和任何模拟框架。创建这个接口和实现类:

public interface SystemExit {
    void exit(int code);
}

public class SystemExitImpl implements SystemExit {
    public void exit(int code) {
        System.exit(code);
    }
}

然后,使包含parseDataaSystemExit作为构造函数参数的类并将其存储在成员变量中(或为成员变量设置一个设置器,让您在构造后设置它)。在您的生产代码中,传递一个SystemExitImpl. 在您的测试中,创建一个模拟SystemExit并通过它。

于 2019-05-29T18:10:58.307 回答