прохождение параметризованные ввода 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},
});
}
}