Mockito: метод заглушки со сложным объектом в качестве параметра


Может быть, это вопрос новичка, но не могу найти ответ.

Мне нужно заглушить метод с помощью Mockito. Если метод имеет" простые " аргументы, то я могу это сделать. Например, метод поиска с двумя параметрами, цветом автомобиля и количеством дверей:

 when(carFinderMock.find(eq(Color.RED),anyInt())).thenReturn(Car1);
 when(carFinderMock.find(eq(Color.BLUE),anyInt())).thenReturn(Car2);
 when(carFinderMock.find(eq(Color.GREEN), eq(5))).thenReturn(Car3);
Проблема заключается в том, что аргумент find является сложным объектом.
 mappingFilter = new MappingFilter();
 mappingFilter.setColor(eq(Color.RED));
 mappingFilter.setDoorNumber(anyInt());
 when(carFinderMock.find(mappingFilter)).thenReturn(Car1);

Этот код не работает. Ошибка " недопустимое использование сопоставителей аргументов! Ожидается 1 совпадение, записано 2".

Не удается изменить метод " find, это должен быть параметр MappingFilter.

Я предполагаю, что я должен сделать "что-то", чтобы указать Mockito, что когда mappingFilter.getColor-красный, и mappingFilter.getDoorNumber-любой, тогда он должен вернуть Car1 (и то же самое для двух других предложений). Но как это сделать?

2 9

2 ответа:

Используйте сопоставитель Hamcrest, как показано в документации:

when(carFinderMock.find(argThat(isRed()))).thenReturn(car1);

Где isRed() определяется как

private Matcher<MappingFilter> isRed() {
    return new BaseMatcher<MappingFilter>() {
        // TODO implement abstract methods. matches() should check that the filter is RED.
    }
}

Вам нужно правильно реализовать equals() Метод вашего MappingFilter. В equals () Вы должны сравнивать только цвет, а не номер двери.

В простейшей форме это должно выглядеть так -

@Override
public boolean equals(Object obj) {
    MappingFilter other = (MappingFilter) obj;
    return other.getColor() == this.getColor();
}

Кроме того, вы должны сформировать свой MappingFilter просто, как показано ниже, вместо использования любого matcher, такого как eq

 mappingFilter = new MappingFilter();
 mappingFilter.setColor(Color.RED);
 mappingFilter.setDoorNumber(10); //Any integer