加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何对使用ProcessBuilder和Process的Java方法进行单元测试?

发布时间:2020-12-15 00:56:15 所属栏目:Java 来源:网络整理
导读:我有一个 Java方法,用ProcessBuilder启动一个Process,并将其输出管道输出到一个字节数组,然后在进程完成后返回它的字节数组. 伪代码: ProcessBuilder b = new ProcessBuilder("my.exe")Process p = b.start();... // get output from process,close process
我有一个 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,另一个实现模拟了这种行为.稍后您甚至可以使用另一个实现来执行您需要的操作而无需启动另一个进程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读