Как использовать заглушки Mockito в поставщике параметров JUnitParams?
Я пытаюсь выучить Юнит. Работая над конкретной проблемой, я решил использовать провайдеры параметров JUnitParams. Каждый набор параметров для тестового метода, который я пишу, должен содержать два входных значения и список, по которому будут проверяться результаты вызова метода:
private static final Object[] getConstraints() {
return new Object[]{
new Object[]{15, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomA, classroomB})},
new Object[]{15, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})},
new Object[]{15, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{classroomA})},
new Object[]{30, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomB})},
new Object[]{30, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})},
new Object[]{30, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})},
new Object[]{45, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{})},
new Object[]{45, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{})},
new Object[]{45, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})},
};
}
classroomA
а также classroomB
фактически подготовлены заглушки Mockito перед каждым выполнением теста:
@Before
public void setUp() {
classroomA = mock(Classroom.class);
classroomB = mock(Classroom.class);
classrooms = Arrays.asList(new Classroom[]{classroomA, classroomB});
when(classroomA.getName()).thenReturn("A");
when(classroomA.getCapacity()).thenReturn(20);
when(classroomA.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.MICROPHONE}));
when(classroomB.getName()).thenReturn("B");
when(classroomB.getCapacity()).thenReturn(40);
when(classroomB.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.PROJECTOR}));
bookingSystem = new BookingSystem(classrooms);
}
Проблема возникает, когда я пытаюсь использовать вышеупомянутые списки Classroom
объекты:
@Test
@Parameters(method = "getConstraints")
public void shouldBookClassroomMeetingConstraints(int capacity, Equipment equipment, List<Classroom>
suitableClassrooms) {
Assert.assertTrue("Should book a classroom that has a minimum capacity of " + capacity + " and has " +
equipment,
suitableClassrooms.contains(bookingSystem.book(capacity, equipment, ANY_DAY_OF_WEEK, ANY_HOUR)));
}
Отладка показывает, что во время первого запуска suitableClassrooms
содержит 2 объекта, но дальнейшая проверка показывает, что все элементы нулевые - заготовок, которые я подготовил, там нет. Очевидно, что тесты не проходят или не проходят там, где они должны пройти или не пройти.
Есть ли ограничения на использование JUnitParams с Mockito или я их неправильно использую? Как правильно их использовать?
Также возможно, что это неправильный метод юнит-тестирования. Если это так, то как правильно написать тест, который проверяет, находится ли результат вызова метода в заданном массиве?
2 ответа
Ваш тест не работает, потому что JUnitParamsRunner
Бегун собирает параметры для теста (т.е. вызывает getConstraints
метод) до вызова @Before
методы и даже раньше @BeforeClass
, Так classroomA
а также classroomB
являются нулевыми в этот момент. Поэтому suitableClassrooms
состоит из нулевых элементов.
Решение состоит в том, чтобы инициализировать classroomA
а также classroomB
в getConstraints()
метод.
Также я верю, что вы можете избавиться от мокито здесь. Classroom
выглядит как POJO, и нет необходимости издеваться над POJO. В таком случае вам просто нужно создать Classroom
экземпляр и заполните его необходимыми данными.
Вы должны сообщить классу, что вы выполняете тестовые случаи с Mockito. добавьте ниже на уровне класса, и это должно работать.
@RunWith(MockitoJUnitRunner.class)