2016-11-03 15 views
0

JUnitParamsMockitoを使ってテストクラスを作成しています。 Mockito mockparameterとしたいと思います。私のテストでは、約10個のモックがあり、それに対して特別な動作を定義するために1個のモックだけを渡したいと思います。JUnitParamsメソッドでフィールド変数を設定した後にフィールド変数がnullになるのはなぜですか?

簡単な例で問題を再現しました。

私の問題:私は方法parametersForTestで変数myListを初期化するが、私はtest方法myListにデバッグするときはnullですが、paramは私の希望モックです。

@RunWith(JUnitParamsRunner.class) 
public class MockitoJUnitParamsTest { 

    private List myList; 

    @Test 
    @Parameters 
    public void test(List param) { 
     assertThat(param).isEqualTo(this.myList); 
    } 

    public Object[] parametersForTest() { 
     myList = Mockito.mock(List.class); 
     return new Object[]{myList}; 
    } 
} 

私が使用

  • JUnitParamsバージョン1.0.5
  • JUnitのバージョン4.12
  • Mockitoバージョン1.10.19

なぜはmyList nullであり、私はそれをどのように修正することができます?

答えて

3

parametersForTest()メソッドを実行しているMockitoJUnitParamsTestクラスのインスタンスは、実行中のtest()と同じではありません。これは、Junitがテストメソッドごとに異なるインスタンスを作成するためです。あなたのケースで 、はmyList静的

private static List myList; 

を作ることは、部分的に問題を解決することができますが、テストを並列に実行する場合、それは失敗することがあります。

2

JUnitフレームワークとランナーは、多くの場合、メソッド呼び出しごとにテストクラスのインスタンスを個別に作成します。それはJUnitParamsが何をするかだように見えます - あなたは、次のテストを使用していることがわかります。

@RunWith(JUnitParamsRunner.class) 
public class JUnitParamsTest { 

    @Test 
    @Parameters 
    public void test(JUnitParamsTest param) { 
     Assert.assertNotNull(param); 
     Assert.assertNotSame(this, param); 
    } 

    Object[] parametersForTest() { 
     return new Object[]{this}; 
    } 

} 

したがって、上記のmyListフィールドはparametersForTestによって設定されていることをあなたの例の問題点は、1から別のオブジェクトのメンバーでありますそのtest(List)が呼び出されています。

まあ問題を解決する方法

、私はあなたがここで達成しようとしているものを、重要な問題があると思いますか? JUnitParamsのポイントは、パラメータがテストメソッドに注入されるため、フィールドを使用する必要はありません。 parametersForTest()メソッド内のフィールド値を変更することは、意図した使用法の範囲外であると思われます。なぜこのようにしたいのかわかりません。

myListを静的にすると、テストクラスに複数のスレッドが同時にアクセスしない限り動作します(一部のユニットテスト環境ではマルチスレッドが実行されるため、ここではリスクがあります) )。

より良い解決策は、パラメータ生成メソッドの内側からフィールドを変更しないようにテストを再設計することです。あなたが与えた例は、JUnitParams自体以外のものをテストしようとしているようには見えないので、あなたが達成しようとしていることを知っているので、良いデザインが何であるかを判断するのを手助けすることはできません。いくつかのテスト方法をに分けてほしいと言っていますか?ひとつのモキトモモ?もしそうなら、なぜですか?私はMockitoがこれをサポートするかどうか分からない(私は試していない)。単体テストはお互いに分離されていることが一般的であるため、毎回新しいモックを作成することをお勧めします。

関連する問題