依存関係自体は予期される動作ではありませんが、依存関係で呼び出されるアクションは確実にそうです。あなた (呼び出し元) が知っていることをテストし、SUT の内部動作についての詳細な知識を必要とするものをテストすることは避けてください。
例を少し拡張して、LinkStorageInterface に次の定義 (疑似コード) があると想像してみましょう。
Interface LinkStorageInterface
void WriteListToPersistentMedium(LinkList list)
End Interface
ここで、あなた (呼び出し元) がそのインターフェイスの具体的な実装を提供しているため、 でメソッドWriteListToPersistentMedium()
を呼び出したときに呼び出されることをテストすることは完全に合理的です。Save()
LinkList
疑似コードを使用すると、テストは次のようになります。
void ShouldSaveLinkListToPersistentMedium()
define da = new MockLinkListStorage()
define list = new LinkList(da)
list.Save()
Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)
end method
SUT またはモックの実装固有の詳細をテストせずに、期待される動作をテストしました。テストを(ほとんど)避けたいのは、次のようなものです。
- メソッドが呼び出された順序
- メソッドまたはプロパティを公開して、確認できるようにする
- テストしている予想される動作に直接関係しないもの
繰り返しになりますが、依存関係は、クラスのコンシューマーとして提供するものであるため、使用されることを期待しています。そうでなければ、そもそもその依存関係を持つ意味がありません。