2012-04-13 12 views
8

プライベートメソッドをJUNITテストで保護するように変更することをお勧めしますか?プライベートメソッドをテスト用に保護するように変更する

+0

なぜでしょうか?あなたはテストの前に何かを変えます、私はそれの理由を見ることができませんか? – Nanne

+2

ほとんど確かに良い考えではありません。クラスの内部メソッドを直接テストする場合は、それらを別のクラスにリファクタリングすることを検討する必要があります。 –

+0

プライベートメソッドが単体テスト環境で利用できないリソースを返す場合に、これを実行しました。それを呼び出す他の(非プライベート)メソッドをテストしたいと思います。それを保護することにより、無効にすることができるリソースの代わりにいくつかのスタブ/モックを返すように、オーバーライドすることができます。これは単体テストが実現可能になることを意味し、私はこれを別の方法で見つけることができませんでしたが、それは理想的ではありません。 –

答えて

9

時には役に立ちます。

クラスが拡張可能な場合は、メソッドをfinalにしてください。

また、メソッドが同じパッケージのサブクラスまたは外部クラスによって呼び出されることは想定されていないことを文書化してください。

私はGuava @VisibleForTestingアノテーションを使用して、メソッドが実際にプライベートであるべきことを明確にしています。

+0

@VisibleForTestingに私の目を開いてくれてありがとう。私はこれが存在するのか分からなかった。これはテストの目的のためだけに実装の構文に影響するという点で少し不完全だと感じていますが、非公開にする必要があるメンバーやメソッドを公開するよりも優れています。また、インターフェイスメソッドへのテストを制限することは、過度に厳しく、ときには実用的でない制限と思われます。 – Lolo

4

代わりにメソッドパッケージをローカルにすることができます。

リフレクションを使用してプライベートメソッドを呼び出すことも、間接的にしか直接テストしないこともできます。

5

一般的にはありません。ユニットテストの考え方は、ユニットをテストすることです。つまり、インタフェースメソッドの実装です。 "見る"ことができないメソッドをテストしたい場合、これはコードの匂いかもしれません。たぶん、UIコードなどからビジネスロジックを十分に分離していない可能性があります。

あなたのアーキテクチャを再考することをお勧めします。しかし、代わりにあなたのコードをテストしないのであれば、それらのメソッドを保護することをお勧めします。

1

@ user714965が示唆しているようにリファクタリングすることをお勧めしますが、PowerMockのMockPrivateは、プライベートメソッドの表示を開かずに嘲笑を行うことができます。

通常、テストを書くと、プライベートメソッドをモックする必要はありません。

関連する問題