Mockito Verify: проверено во время проверки (), чем во время вызова метода издевательства

Я вызываю метод PerformAction со списком объектов и проверяю то же самое. После вызова этого метода я модифицирую некоторые «объекты».

Проверка Mockito не выполняется, говоря, что аргументы не совпадают (показывая измененные объекты), но в режиме отладки я вижу, что объекты были правильными, как это было необходимо.

В идеале этого не должно происходить, так как проверка должна применяться на основе фактического вызова метода. Применяется ли проверка во время вызова проверки в тестовом методе, чем во время вызова издевательского метода?

Тестовый класс

@Test
public void test() throws Exception {
    List<ABC> objects = new ArrayList<ABC>();
    //populate objects.
    activity.performActions(objects);               
    verify(activity, times(1)).doActivity(objects);
}

Метод тестирования:

public void performActions(List<ABC> objects) {

    activity.doActivity(urlObjects2PerformAction);
    //Modify objects                

}

Ошибка, которую я получаю, выглядит следующим образом (это для полного кода. Я дал наименьший возможный фрагмент):

Argument(s) are different! Wanted:
activity.doActivity(
.......
......

person instanceOfObject    schedule 24.08.2013    source источник
comment
Сократите код до самого короткого примера, который воспроизводит проблему, вставьте полный код этого примера и точное и полное сообщение об ошибке, которое вы получите.   -  person JB Nizet    schedule 25.08.2013
comment
@JBNizet Изменил вопрос.   -  person instanceOfObject    schedule 25.08.2013


Ответы (3)


Об этом уже спрашивали - в Может ли Mockito проверять параметры на основе их значений во время вызова метода?

Когда вы вызываете метод, который был заглушен с помощью Mockito, Mockito сохранит переданные ему аргументы, чтобы вы могли использовать verify позже. То есть он хранит ссылки на объекты, а не содержимое самих объектов. Если позже вы измените содержимое этих объектов, то ваш вызов verify сравнит свои аргументы с обновленными объектами, а не сделает глубокую копию исходных объектов.

Если вам нужно проверить, каким было содержимое объектов, вам нужно ЛИБО

  • сохранить их самостоятельно в момент вызова метода; ИЛИ
  • проверить их во время вызова метода.

Правильный способ сделать это — использовать Mockito Answer. Таким образом, для второго варианта вы должны создать Answer, который выполняет проверку и выдает AssertionFailedError, если значения аргументов неверны; вместо использования verify в конце теста.

person Dawood ibn Kareem    schedule 24.08.2013

verify сравнивает содержимое параметра во время вызова verify, а не при вызове фиктивного метода. Если содержимое списка изменено, verify будет использовать измененные значения.

Альтернативой является использование вместо этого Answer для проверки параметров сразу после вызова метода, или вы можете создать новый список вместо изменения старого.

person fgb    schedule 24.08.2013

теперь это можно решить с помощью ArgumentCaptor

@Test
public void test() throws Exception {
    List<ABC> objects = new ArrayList<ABC>();
    ArgumentCaptor<List<ABC> objectsCaptor = ArgumentCaptor<List.class>;
    //populate objects.
    activity.performActions(objects);               
    verify(activity, times(1)).doActivity(objectsCaptor.capture());
}
person Samir Ghoneim    schedule 12.11.2018
comment
Какую Java вы используете? Кажется, что ответ не работает для Java 8, по крайней мере, для сложного объекта. - person Dmytro Chasovskyi; 14.02.2019