我有一个
Java方法,用ProcessBuilder启动一个Process,并将其输出管道输出到一个字节数组,然后在进程完成后返回它的字节数组.
伪代码:
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)
有什么想法吗?
答案 – 正如奥拉夫推荐的那样,我最终将这些线重构为接口
Process start(String param) throws IOException;
我现在将此接口的一个实例传递给我想要测试的类(在其构造函数中),通常使用带有原始行的默认实现.当我想测试时,我只需使用接口的模拟实现.像魅力一样,虽然我想知道我是否在这里过度接口……
解决方法
保护自己免受被嘲笑的课程.创建一个接口,用于执行您真正想要的操作(例如,隐藏外部过程完全涉及的事实)或仅用于Process和ProcessBuilder.
您不希望测试,ProcessBuilder和Process工作,只是您可以使用他们的输出.当您创建一个接口时,一个简单的实现(可以很容易地检查)委托给ProcessBuilder和Process,另一个实现模拟了这种行为.稍后您甚至可以使用另一个实现来执行您需要的操作而无需启动另一个进程.