1

JUnitParamsと を使用してテスト クラスを作成していMockitoます。Mockito mockとして使いたいですparameter。私のテストでは、約 10 個のモックがあり、特別な動作を定義するために 1 つのモックのみを渡したいと考えています。

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

私の問題: method で変数を初期化しますmyListが、メソッドにparametersForTestデバッグすると null になりますが、目的のモックです。testmyListparam

@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
  • モッキート バージョン 1.10.19

myList が null である理由と、それを修正するにはどうすればよいですか?

4

2 に答える 2

3

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

private static List myList;

問題を部分的に解決できますが、テストを並行して実行すると失敗する可能性があります。

于 2016-11-03T11:30:44.023 に答える
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ているオブジェクトとは異なるオブジェクトのメンバーであることtest(List)です。

直し方

重要な質問は、ここで何を達成しようとしているのかということだと思います。JUnitParamsの要点は、パラメーターがテスト メソッドに挿入されるため、フィールドを使用する必要がないことです。メソッド内でフィールド値を変更することparametersForTest()は意図された使用法から外れているように思えますが、なぜこれを行う必要があるのか​​ わかりません。

これは、テストクラスが複数のスレッドによって同時にアクセスされない限り機能するmyListはずです (一部の単体テスト環境はマルチスレッドで実行されるため、ここにはリスクがあります)。

より良い解決策は、パラメーター生成メソッド内からフィールドを変更しないようにテストを再設計することです。あなたが与えた例は、JUnitParams 自体以外のものをテストしようとしているようには見えないので、あなたが何を達成しようとしているのかわからないので、良いデザインが何であるかを判断するのを助けることはできません. 単一の Mockito モックを共有する複数のテスト メソッドが必要だとおっしゃっていますか? もしそうなら、なぜですか?Mockito がこれをサポートするかどうかはわかりません (試したことはありません)。単体テストは通常​​、互いに分離されていると想定されているため、毎回新しいモックを作成することをお勧めします。

于 2016-11-03T11:50:48.000 に答える