これはすばらしい質問です。その根本的な原因は次のとおりだと思います。私たちはユニットテストだけでなくJUnitを使用しています。したがって、質問は分割する必要があります。
- 統合(または他のユニット以上のテスト)テストでMockito.verify()を使用する必要がありますか?
- ブラックボックスユニットテストでMockito.verify()を使用する必要がありますか?
- ホワイトボックスの単体テストでMockito.verify()を使用する必要がありますか?
したがって、ユニット以上のテストを無視する場合は、質問を言い換えることができます。「Mockito.verify()でホワイトボックスユニットテストを使用すると、ユニットテストと実装の間に素晴らしいカップルが作成されます。 「ユニットテストと、これに使用する経験則」
それでは、このすべてを段階的に見ていきましょう。
*- 統合テスト(またはユニットテスト以上のテスト)でMockito.verify()を使用する必要がありますか?*答えは明らかにノーだと思います。さらに、これにはモックを使用しないでください。テストは、実際のアプリケーションにできるだけ近いものにする必要があります。アプリケーションの分離された部分ではなく、完全なユースケースをテストしています。
* ブラックボックスとホワイトボックスの単体テスト * ブラックボックスアプローチを使用している場合、実際に何をしているのか(すべての等価クラス)の入力、状態、および期待される出力を受け取るテストを指定します。このアプローチでは、モックを使用することは一般的に正当化されますが(モックが正しいことを模倣するだけであり、テストしたくない)、Mockito.verify()の呼び出しは不必要です。
あなたが実際に何をしているのかホワイトボックスアプローチを使用している場合は、ユニットの動作をテストしています。このアプローチでは、Mockito.verify()の呼び出しが不可欠です。ユニットが期待どおりに動作することを確認する必要があります。
グレーボックステスト
の経験則ホワイトボックステストの問題は、それが高い結合を作成することです。1つの可能な解決策は、ホワイトボックステストではなく、グレーボックステストを行うことです。これは一種のブラック&ホワイトボックステストの組み合わせです。ホワイトボックステストのように、実際にユニットの動作をテストしていますが、一般的には、可能な場合は実装に依存しないようにします。可能な場合は、ブラックボックスの場合と同様にチェックを行い、出力が期待どおりであることを表明します。だから、あなたの質問の本質はそれが可能なときです。
これは本当に難しいです。良い例はありませんが、例を挙げましょう。上記のequals()とequalsIgnoreCase()で述べたケースでは、Mockito.verify()を呼び出さず、出力をアサートするだけです。それができなかった場合は、できるまでコードを小さな単位に分解してください。一方、いくつかの@Serviceがあり、@ Serviceの本質的にラッパーである@ Web-Serviceを記述しているとすると、@ Serviceへのすべての呼び出しが委任されます(追加のエラー処理が行われます)。この場合、Mockito.verify()の呼び出しは必須です。@ Seriveに対して行ったすべてのチェックを複製してはならず、正しいパラメーターリストで@Serviceを呼び出していることを確認してください。