ProcessBuilder で Process を起動し、その出力をバイト配列にパイプして、プロセスが終了するとそのバイト配列を返す Java メソッドがあります。
擬似コード:
ProcessBuilder b = new ProcessBuilder("my.exe")
Process p = b.start();
... // get output from process, close process
このメソッドの単体テストを行う最良の方法は何でしょうか? 信じられないほど素晴らしいJMockitを使用しても、 ProcessBuilder をモックする方法が見つかりませんでした (これは最終的なものです)。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;
ここで、このインターフェイスのインスタンスを、テストしたいクラス (コンストラクター内) に渡します。通常は、元の行の既定の実装を使用します。テストしたいときは、インターフェイスのモック実装を使用するだけです。私はここで過度にインターフェースしているのではないかと思いますが...