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 ответа:
Используйте сопоставитель 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