我有一个 Java 方法,它使用 ProcessBuilder 启动一个进程,并将其输出通过管道传输到一个字节数组中,然后在进程完成时返回它的字节数组。
伪代码:
ProcessBuilder b = new ProcessBuilder("my.exe")
Process p = b.start();
... // get output from process, close process
对这种方法进行单元测试的最佳方法是什么?我还没有找到模拟 ProcessBuilder 的方法(它是最终的),即使使用非常棒的JMockit,它也会给我一个 NoClassDefFoundError:
java.lang.NoClassDefFoundError: test/MockProcessBuilder
at java.lang.ProcessBuilder.<init>(ProcessBuilder.java)
at mypackage.MyProcess.start(ReportReaderWrapperImpl.java:97)
at test.MyProcessTest.testStart(ReportReaderWrapperImplTest.java:28)
有什么想法吗?
答案- 正如 Olaf 建议的那样,我最终将这些行重构为一个界面
Process start(String param) throws IOException;
我现在将这个接口的一个实例传递给我想要测试的类(在它的构造函数中),通常使用带有原始行的默认实现。当我想测试时,我只需使用接口的模拟实现。就像一个魅力,虽然我想知道我是否在这里过度接口......