Mockitoで検証する方法を探しています。テスト中に特定のモックとのやり取りがなかったことを確認します。検証モードnever()
を使用して特定のメソッドを実現するのは簡単ですが、完全なモックの解決策はまだ見つかりません。
私が実際に達成したいこと:テストで確認し、コンソールに何も印刷されないことを確認します。 jUnitの一般的な考え方は次のようになります。
_private PrintStream systemOut;
@Before
public void setUp() {
// spy on System.out
systemOut = spy(System.out);
}
@After
public void tearDown() {
verify(systemOut, never()); // <-- that doesn't work, just shows the intention
}
_
PrintStream
には多数のメソッドがあり、個別の検証ですべてを検証したくない-_System.err
_...でも同じ.
したがって、簡単な解決策があれば、テストカバレッジが良好であれば、ソフトウェアエンジニア(および私)にSystem.out.println("Breakpoint#1");
またはe.printStacktrace();
変更をコミットする前。
これを使って :
import static org.mockito.Mockito.verifyZeroInteractions;
// ...
private PrintStream backup = System.out;
@Before
public void setUp() {
System.setOut(mock(PrintStream.class));
}
@After
public void tearDown() {
verifyZeroInteractions(System.out);
System.setOut(backup);
}
verifyZeroInteractions(systemOut);
コメントで述べたように、これはスパイでは機能しません。
ほぼ同等ではあるがより完全な回答については、この質問に対するゴンタードの回答を参照してください。
あなたはわずかに異なるタックを試すことができます:
private PrintStream stdout;
@Before public void before() {
stdout = System.out;
OutputStream out = new OutputStream() {
@Override public void write(int arg0) throws IOException {
throw new RuntimeException("Not allowed");
}
};
System.setOut(new PrintStream(out));
}
@After public void after() {
System.setOut(stdout);
}
必要に応じて、モックの匿名タイプを切り替えて、 Don Robyが示唆するように を確認できます。
この問題を解決する1つの方法は、テストに使用するクラスをリファクタリングして、出力に使用できるPrintStreamを注入できるようにすることです。これにより、System
クラスの動作に依存せずに単体テストを実行できます。対応するテストクラスからのみ使用するため、このインジェクションにはパッケージプライベートコンストラクターを使用できます。したがって、このように見えるかもしれません。
public class MyClass{
private PrintWriter systemOut;
public MyClass(){
this(System.out);
}
MyClass(PrintWriter systemOut){
this.systemOut = systemOut;
// ...any other initialisation processing that you need to do
}
}
そして、クラス自体の中で、System.outの代わりにsystem.outの代わりにsystemOut変数を使用します。
次に、テストクラス内で、モックPrintStream
を作成し、パッケージプライベートコンストラクターに渡して、テストするオブジェクトを取得します。これで、テストから好きなアクションを実行でき、verify
を使用して、モックPrintStream
に対する効果を確認できます。