Как использовать заглушки 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)
Другие вопросы по тегам