単体テストを学習しようとしていますが、それによる設計上の問題があります。クラス A がクラス B に依存しているとします。A を単体テストするために B のスタブを作成する場合、ほとんどの分離フレームワークでは、B がインターフェイスである必要があるか、A で使用されるすべてのメソッドが仮想である必要があります。B は、単体テストのために本質的に非仮想メソッドを持つ具象クラスにすることはできません。
これにより、製品コードの設計に大きな制限が課せられます。すべての依存関係に対してインターフェイスを作成する必要がある場合、クラスの数は 2 倍になります。単一責任の原則に従うと、相互に依存する小さなクラスが発生するため、インターフェイスの数が大幅に増加します。また、揮発性の依存関係 (将来変更される可能性があります) のインターフェイスを作成するか、設計で拡張性が必要な場合に使用します。テストのためだけにインターフェースで本番コードを汚染すると、その複雑さが大幅に増加します。すべてのメソッドを仮想化することも、良い解決策ではないようです。これにより、継承者は、これらのメソッドがオーバーライドされていなくてもオーバーライドされても問題ないという印象を与えられます。実際には、これは単体テストの副作用にすぎません。
これは、テスト可能なオブジェクト指向設計では具体的な依存関係が許可されないということですか、それとも具体的な依存関係を偽造してはならないということですか? 「ユニットテストを正しく行うには、すべての依存関係を偽造(スタブまたはモック)する必要があります」これまでに学んだことなので、後者はそうではないと思います。JustMock と Isolator 以外の分離フレームワークでは、仮想メソッドなしで具体的な依存関係を偽造することはできず、JustMock と Isolator の力が悪い設計につながると主張する人もいます。任意のクラスをモックできる機能は非常に強力であり、自分が何をしているのかを理解していれば、プロダクション コードの設計をクリーンに保つことができると思います。