Mockito Verify: Проверен по време на 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