web-dev-qa-db-ja.com

Guava @VisibleForTesting:完全な例を教えてください

私の目的は、プライベートメソッドの単体テストを行うことであり、@VisibleForTestingそしてプライベートメソッドに使用します。私はかなりの検索を行いましたが、この機能を示す完全な例を見ることができません。

例えば:

class MyClass {
    @VisibleForTesting 
    private double[] getWorkArray(double[] values,int length) {
               :
               :
        return <some double array> 
    }
}

今、JUnitでは、私ができる必要があります

@Test
public void testProvateMethod() {
    MyClass object = new MyClass();
    assertNotNull(object.getWorkArray(...);
}

しかし、難しい部分は、以下を理解/実行できないことです。a)関連する注釈プロセッサを含めるためのmavenコンパイラプラグインのスニペットb)実際にプライベートメソッドをテストできる。 (メソッドの可視性に関連するエラーをスローするため)

JUnitでテストを記述している間、プライベートアクセスエラーのために、アクションで実行できません。例:mvn clean test

プライベートメソッドのJUnitテストを実行するために必要なすべての手順の完全な例を提供してください。

18
user3709525

まず、私はnotプライベートメソッドのテストを推奨します。ほとんどの場合、ユニットテストはパブリックメソッドをテストする必要があります。プライベートメソッドをテストする必要がある場合、通常、設計が悪いことを示しています。

に関して @VisibleForTesting、Guavaのパッケージメソッドで使用され、JUnit APIの一部ではありません。アノテーションはメソッドをテストできることを示す単なるタグであり、JVMにロードされていません。したがって、非パブリックメソッドをテストする必要がある場合は、メソッドパッケージをスコープにするは、同じパッケージの単体テストクラスに表示されます。

最後に、リフレクトを使用すると、本当にテストする必要がある場合にプライベートメソッドにアクセスできます。

プライベートメソッドのテストは、悪いパターンの1つでなければなりません。ただし、プライベートメソッドをテストする衝動を感じることがよくあります。この場合、個人的にReflectionTestUtilsを使用してメソッドをテストします。これは、プライベートメソッドの元の意図を保持し、メソッドのみをテストしたかったためです。以下は私のサンプルの例です。

MyClass myClass = new MyClass();

ReflectionTestUtils.invokeMethod(myClass, "getWorkArray", values, length);

1つの欠点は、メソッドの名前を文字列として取得するという事実であり、リファクタリングがIDEAで正しく変換されないという事実を除いて、かなり悲しいことです。

役に立てば幸いです。

ありがとう。

2
Dark