29

ユニットテストにMockitoを使用しています。
Junitテストのようにパラメータ化された入力パラメータを送信することは可能かどうか疑問に思っています。

@InjectMocks
MockClass mockClass = new MockClass();

@Test
public void mockTestMethod()
    {
    mockClass.testMethod(stringInput); 
// here I want to pass a list of String inputs 
// this is possible in Junit through Parameterized.class.. 
// wondering if its can be done in Mockito
    } 
4

3 に答える 3

30

JUnitでは、パラメーター化されたテストは、テストが複数回インスタンス化されることを保証する特別なランナーを使用するため、各テストメソッドは複数回呼び出されます。Mockitoは特定の単体テストを作成するためのツールであるため、異なるMockitoの期待値で同じテストを複数回実行する組み込み機能はありません。

テスト条件を変更したい場合は、次のいずれかを実行するのが最善の策です。

  • 必要なモック入力のパラメーターを使用して、JUnitを使用してテストをパラメーター化します。
  • テストでさまざまなパラメータのループを実行します。これにより、残念ながら「メソッドごとに1つのテスト」の哲学が回避されます。
  • @Test実際にテストを実行するメソッドを抽出し、必要なモックごとに新しいメソッドを作成します。

@Parameterizedテストパラメータとしてモックオブジェクトを使用することは禁止されていないことに注意してください。モックに基づいてパラメーター化することを検討している場合は、それを行うことができます。モックを作成し、テストの静的メソッドで期待値を設定することもできます。


ランナーに関する注意:このパラメーター化されたテストランナーは、MockitoのMockitoJUnitRunnerと競合します:各テストクラスは1つのランナーのみを持つことができます。両方を使用する場合は、セットアップに@Beforeメソッドと@Afterメソッド、またはMockitoJUnit4ルールに切り替えることをお勧めします。

例として、パラメータ化されたランナーとJUnitルールの詳細を説明する別の回答から圧縮し、JUnit4のパラメータ化されたテストのドキュメントページとMockitoRuleのドキュメントページから持ち上げます。

@RunWith(Parameterized.class)
public class YourComponentTest {
    @Rule public MockitoRule rule = MockitoJUnit.rule();
    @Mock YourDep mockYourDep;

    @Parameters public static Collection<Object[]> data() { /* Return the values */ }

    public YourComponentTest(Parameter parameter) { /* Save the parameter to a field */ }

    @Test public void test() { /* Use the field value in assertions */ }
}
于 2012-09-26T16:41:42.100 に答える
12

利用できない古いバージョンのモックで立ち往生している場合MockitoRule、他の可能性は、モックを明示的に次のように初期化することMockitoAnnotations.initMocksです。

@RunWith(Parameterized.class)
public class YourComponentTest {        
    @Mock YourDep mockYourDep;

    @Parameter
    public Parameter parameter;

    @Parameters public static Collection<Object[]> data() { /* Return the values */ }

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test public void test() { /* Use the field value in assertions */ }
}
于 2017-01-09T14:30:02.300 に答える
7

JUnitParamsRunnerを使用できます。これが私がそれをする方法です:

import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

import java.util.Arrays;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;

@RunWith(value = JUnitParamsRunner.class)
public class ParameterizedMockitoTest {

    @InjectMocks
    private SomeService someService;
    @Mock
    private SomeOtherService someOtherService;

    @Before
    public void setup() {
        initMocks(this);
    }

    @Test
    @Parameters(method = "getParameters")
    public void testWithParameters(Boolean parameter, Boolean expected) throws Exception {
        when(someOtherService.getSomething()).thenReturn(new Something());
        Boolean testObject = someService.getTestObject(parameter);
        assertThat(testObject, is(expected));
    }

    @Test
    public void testSomeBasicStuffWithoutParameters() {
        int i = 0;
        assertThat(i, is(0));
    }

    public Iterable getParameters() {
        return Arrays.asList(new Object[][]{
                {Boolean.TRUE, Boolean.TRUE},
                {Boolean.FALSE, Boolean.FALSE},
        });
    }
}
于 2017-07-20T05:29:33.390 に答える