OOP は、可能な多くのパラダイムの 1 つにすぎません。それ自体は目的ではなく、目的を達成するための手段です。他のパラダイムの方が適している場合は、オブジェクト指向でプログラミングする必要はありません。
また、ユニット テストはオブジェクト指向言語よりも関数指向言語の方がはるかに簡単になる傾向があると指摘する前に、無数の賢明な人々が述べています。これは、テストの自然な単位が関数であるためです。これはクラス (プライベート メソッドやあらゆる種類の奇妙な状態を持つ可能性がある) ではなく、関数です。
一方、テスト容易性はそれ自体に価値があります。コードがテスト可能でない場合、それをテストすることはできません (当然のことです)。したがって、どちらか一方の極端を選択する必要がある場合、私は間違いなくテスト容易性を選択します。
しかし、明らかな疑問は、本当にすべてのプライベート メソッドをテストする必要があるかということです。これらはクラスのパブリック コントラクトの一部ではなく、単独では意味がない場合があります。パブリック メソッドは、特定の目的を持っているため、テストすることが重要です。これらは、この非常に特定のコントラクトを満たし、オブジェクトを一貫した状態にしておく必要があります。それらは本質的にテスト可能であり、プライベート メソッドはそうではないかもしれません。(プライベート メソッドが何をするかは誰が気にしますか? クラス コントラクトの一部ではありません)
おそらく、より良い解決策は、それ以外の場合はプライベートなものの一部を別のクラスにリファクタリングすることです。おそらく、プライベート メソッドをテストする必要性は、あなたが考えているほど大きくはありません。
別の注意として、他のモッキング フレームワークでは、プライベートなものもモックできます。
編集: もう少し考えた後、プライベート メンバーを公開するだけではおそらく恐ろしい考えであることを強調したいと思います。そもそもプライベート メンバーを使用する理由は次のとおりです。クラスの不変条件は常に維持する必要があります。外部コードがクラスを無効な状態にすることは不可能でなければなりません。それは単なる OOP ではなく、常識でもあります。プライベート メソッドは、クラス内で内部的により細かい粒度を許可するためのものであり、複数のメソッドにまたがるいくつかのタスクを除外するなどですが、通常はそうではありません。クラス不変を保持します。彼らは仕事の半分を行い、残りの半分を行うために後で呼び出される他のプライベート メソッドに依存します。一般的にはアクセスできないため、安全です。それらを呼び出すことができるのは他のクラス メソッドだけなので、それらが不変条件を保持している限り、すべて問題ありません。
そうです、プライベート メソッドをパブリックにすることでテスト可能にしますが、単体テストでは簡単に発見できないバグの原因にもなります。クラス「間違った」を使用できるようにします。適切に設計されたクラスは、外部コードでどのように使用されても、常にその不変条件を維持します。すべてを公開すると、それはもはや不可能です。外部コードは、そのコンテキストで使用されない可能性があり、クラスを無効な状態にスローする内部ヘルパー関数を呼び出すことができます。
そして、単体テストは、これが起こらないことを本当に保証することはできません. したがって、予想よりもはるかに大きなエラーの原因を導入するリスクがあると思います.
もちろん、上記のプライベート メンバー (クラスの不変条件を保持しないもの) の定義を考えると、他の多くのメソッドを安全に public にすることが可能かもしれません。それらを外部コードから。そのため、プライベート メソッドを少なくすることで問題を軽減できますが、すべてがパブリックである場合に可能になるように、外部コードがクラスを壊すことはありません。