#java #unit-testing #mocking #mockito
Вопрос:
Mockito используется для повторения одного и того же метода дважды, и он должен возвращать разные значения для каждого макета. Но когда я тестирую, он всегда будет учитывать последнее возвращаемое значение, над которым издеваются.
Строка when(ServiceB.GetById(1)).thenReturn(первое значение); возвращает последнее значение вместо первого значения
В настоящее время это выглядит так:
when(serviceA.findById(any(String.class))).thenReturn(Object1);
when(serviceB.getById(Object1)).thenReturn(FirstValue);
when(serviceC.convert(any(Integer.class), any(Integer.class))).thenReturn(Object2);
when(serviceB.getById(Object2)).thenReturn(LatestValue);
when(serviceA.save(Object2)).then(returnsFirstArg());
Как исправить это таким образом, чтобы при(ServiceB.GetById(2)).thenReturn(последнее значение); возвращалось последнее значение вместо первого значения?
Комментарии:
1. Вы пробовали использовать
reset(serviceB)
?2. Кроме того, вы можете обновить фрагмент кода, чтобы показать, в какой строке вы пытаетесь получить значение. Поскольку параметр для
getById()
отличается, он никогда не должен возвращать одно и то же значение, настроенное для разных значений параметров3. Я только что починил. Пожалуйста, проверьте ответ, который я опубликую в ближайшие минуты.
4. Это из-за того, что метод equals возвращает значение true для вашего объекта?
Ответ №1:
Несмотря на то, что это разные объекты Object1
и Object2
имеют одинаковые значения.
Учитывая фрагмент кода, который я опубликовал в вопросе, Mockito всегда возвращался latestValue
для обеих строк:
when(serviceB.getById(Object1)).thenReturn(FirstValue);
when(serviceB.getById(Object2)).thenReturn(LatestValue);
Но если я изменю Object1
значение перед передачей в макет, то оно будет работать правильно. Что-то вроде приведенного ниже решило проблему:
Object1.setPropertyValue(anyValueDifferentFromObject2)
Комментарии:
1. Я не понимаю, какое значение имеет этот вопрос, но рад, что вы его исправили
2. Это будет полезно для тех, кто является новичком с Mockito и может столкнуться с той же проблемой.