прохождение параметризованные ввода Mockitos

Я использую Mockito для модульного тестирования. Мне интересно, можно ли отправлять параметризованные входные параметры с помощью as в Junit testing
е.г

@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
    } 

3 ответов


В JUnit параметризованные тесты использовать специальный бегунок это гарантирует, что тест создается несколько раз, поэтому каждый метод теста вызывается несколько раз. Mockito-это инструмент для написания конкретных модульных тестов, поэтому нет встроенной возможности запускать один и тот же тест несколько раз с разными ожиданиями Mockito.

Если вы хотите, чтобы ваши условия тестирования изменились, лучше всего сделать один из следующий:

  • Параметризуйте свой тест с помощью JUnit, с параметром для макетных входов, которые вы хотите;
  • запустите цикл различных параметров в своем тесте, который, к сожалению, избегает философии "проверить одну вещь на метод"
  • извлеките метод, который фактически выполняет тест, и создайте новый @Test метод для каждого макета, который вы хотите.

обратите внимание, что нет запрета на использование макетов объектов как @Parameterized параметры испытания. Если вы хотите параметризовать на основе mocks, вы можете это сделать, возможно, создав макет и установив ожидания в статическом методе на тесте.


обратите внимание на бегунов: это параметризованных тестов конфликты с Mockito это MockitoJUnitRunner: каждый тестовый класс может иметь только один бегун. Вы захотите переключиться на @до и @после методов или правило Mockito JUnit4 для настройки, если ты используешь их обоих.

в качестве примера, сжаты от другой ответ это объясняет больше о параметризованных бегунов против правил JUnit и подъема из JUnit4 Параметризованный Тест страница doc и MockitoRule страница doc:

@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 */ }
}

Если вы застряли с более старой версией mockito, где 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 */ }
}

вы можете использовать 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},
        });
    }
}