私は自分のプロジェクトでJUnitとMockitoを使い始めましたが、すぐに気付いたのは、テストクラスにアクセスするためにプライベートメソッドをパブリックに変換することになったということです。これはひどい解決策です。
パブリックメソッドのみをテストするだけで十分な場合もありますが、内部メソッドも実際にテストしたい場合もあります。これに対する回避策はありますか?たとえば、JUnitがプライベートメソッドをパブリックまたはそのようなものとしてモックできるようにする特別なアノテーション?
私は自分のプロジェクトでJUnitとMockitoを使い始めましたが、すぐに気付いたのは、テストクラスにアクセスするためにプライベートメソッドをパブリックに変換することになったということです。これはひどい解決策です。
パブリックメソッドのみをテストするだけで十分な場合もありますが、内部メソッドも実際にテストしたい場合もあります。これに対する回避策はありますか?たとえば、JUnitがプライベートメソッドをパブリックまたはそのようなものとしてモックできるようにする特別なアノテーション?
パブリックメソッドはプライベートメソッドを呼び出す必要があります。したがって、パブリックメソッドのテスト関数を作成することで、プライベートメソッドをテストできます。
それでもJunitsによるプライベート関数をテストしたい場合は、を使用してテストできます reflection
。
メソッドのプロパティを設定する必要がありますsetAccessible==true.
例:
public void testisvalid() throws Exception
{
MyHandler handler = new MyHandler();
Method privateStringMethod = MyHandler.class.getDeclaredMethod("isvalid", Long.class);
privateStringMethod.setAccessible(true);
String = (String) privateStringMethod.invoke(handler, 852l );
assertNotNull(s);
}
getDeclaredMethod
で、メソッドの名前と、関数に渡すprivate
タイプを順番に指定する必要があります。arguments
プライベートメソッドを直接テストする必要があるのは、デザインの匂いです。適切に設計されたクラスでは、すべての機能にアクセスでき、賢明であるため、パブリックインターフェイスを介してテストできます。
これがないということは、通常、クラスが大きすぎて複雑すぎて、一度に複数の責任を処理しようとしていることを意味します。これに対する最善の解決策はリファクタリングです。機能の一部を別のクラスに抽出し、公開して、ユニットで直接テストできるようにすることができます。
最初に尋ねる質問は、これらのプライベートメソッドを追加のヘルパークラスのパブリックインターフェイスの一部にすることができるかどうかです。この場合、このヘルパークラスをテストし、元のクラスにモックヘルパーを注入できます。
それが不可能な場合は、これらのプライベートメソッドを保護し、テストするためだけに保護され、サブクラスによって呼び出されたりオーバーライドされたりしてはならないという事実を文書化し、テストクラスをクラスと同じパッケージに入れます。この保護されたメソッドにアクセスできるようにするためのテスト中。
@VisibleForTesting
この場合、Guavaによって提供された注釈を使用します。
私のMavenビルドインフラストラクチャは、テストソースに個別のディレクトリを提供しますが、パッケージ構造は同じです。したがって、メソッドがパブリックではなく、パッケージにアクセス可能であれば十分です。