クラスXがあり、動作X1を検証する単体テストを作成します。Xを依存関係とするクラスAもあります。
Aの単体テストを作成するとき、Xをモックします。つまり、Aの単体テスト中に、Xのモックの動作をX1に設定(仮定)します。時間が経ち、人々はあなたのシステムを使用し、変更を必要とし、Xは進化します。Xを変更して動作X2を表示します。明らかに、Xの単体テストは失敗し、それらを調整する必要があります。
しかし、Aではどうでしょうか?Aの単体テストは、Xの動作が変更されても失敗しません(Xのモックにより)。「実際の」(変更された)Xで実行すると、Aの結果が異なることを検出する方法は?
「それは単体テストの目的ではない」という線に沿った答えを期待していますが、単体テストにはどのような価値がありますか?すべてのテストに合格したときに、重大な変更が導入されていないことを本当に伝えているだけですか?そして、あるクラスの振る舞いが(喜んでまたは不本意で)変化するとき、どのようにすべての結果を(できれば自動化された方法で)検出できますか?統合テストにもっと集中すべきではないでしょうか?
X1
するとき、あなたはそれがX
インターフェイスを実装していると言っていますX1
。他のテストで使用X1
しX2
たモックへのインターフェースを変更すると、もうコンパイルされないはずです。したがって、それらのテストも修正する必要があります。クラスの動作の変更は重要ではありません。実際、クラスA
は実装の詳細に依存するべきではありません(これはその場合に変更するものです)。そのため、単体テストA
は依然として正しいものでありA
、インターフェイスの理想的な実装を前提に動作することがわかります。