Сообщение об ошибке тестирования в mockito: Аргумент разные! Разыскивается:

Я тестирую остальную конечную точку в своем JUnit и получаю исключение, как показано ниже в список, который присутствует в качестве аргумента внутри метода сохранения,

**"Argument(s) are different! Wanted:"** 
save(
"121",
[[email protected], 
[email protected]]
);
Actual invocation has different arguments:
save(
"121",
[[email protected],  
[email protected]]
 ); 

Когда я отлаживал код, код разбился на строку проверить ниже и бросил выше исключения. Похож на аргументы внутри "testpPList" в пределах сохранения метод отличается. Я не знаю, как это изменилось, когда я их создаю в моем JUNit правильно, а затем вызывается URL RestFul.

Запрос ваших ценных материалов. Спасибо.

код:

@Test
public void testSelected() throws Exception {
    mockMvc.perform(put("/endpointURL")
        .contentType(TestUtil.APPLICATION_JSON_UTF8)
        .content(TestUtil.convertObjectToJsonBytes(testObject)))
        .andExpect(status().isOk());
    verify(programServiceMock, times(1)).save(id, testpPList);
    verifyNoMoreInteractions(programServiceMock);
}

Метод контроллера:

@RequestMapping(value = "/endpointURL", method = RequestMethod.PUT)
public @ResponseBody void uPP(@PathVariable String id, @RequestBody List<PPView> pPViews) {
    // Code to construct the list which is passed into the save method below
    save(id, pPList);
}

Ответ 1

Убедитесь, что вы реализуете метод equals в com.domain.PP.

[изменить]

Обоснование этого вывода состоит в том, что в вашем неудавшемся тестовом сообщении указано, что он ожидает этот список PP

[[email protected], [email protected]]

но он получает этот список PP

[[email protected], [email protected]]

Шестнадцать значений после символа @ для каждого объекта PP являются их хэш-кодами. Потому что они разные, то это показывает, что они принадлежат к разным объектам. Таким образом, реализация equals по умолчанию будет говорить, что они не равны, что и используется verify().

Хорошая практика также реализовать hashCode() всякий раз, когда вы реализуете equals(): Согласно определению hashCode, два объекта, которые равны, ДОЛЖНЫ иметь равные хэш-коды. Это гарантирует, что такие объекты, как HashMap, могут использовать неравенство hashCode как ярлык для объектного неравенства (здесь размещение объектов с разными хэш-кодами в разных кодах).

Ответ 2

Реализация Object#equals(Object) может решить его путем сравнения равенств. Тем не менее, иногда объект, который вы проверяете, не может быть изменен или его функция equals не может быть реализована. Для таких случаев рекомендуется использовать org.mockito.Matchers#refEq(T value, String... excludeFields). Поэтому вы можете использовать что-то вроде:

verify(programServiceMock, times(1)).save(id, refEq(testpPList));

Просто перенос аргумента с помощью refEq решает проблему.