У меня есть метод, который вызывается дважды, и я хочу захватить аргумент вызова второго метода.
Вот что я попробовал:
ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()
Но я получаю TooManyActualInvocations
исключение, так как Мокито считает, что его doSomething
следует вызывать только один раз.
Как я могу проверить аргумент второго вызова doSomething
?
java
unit-testing
mocking
mockito
Эрик Уилсон
источник
источник
doSomething()
в каждом отдельном вызове с этим?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
захваченный аргумент будет дважды повторяться (потому что на самом деле это один и тот же объект person), поэтомуcapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
см. Также groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) и, если необходимо, выполнить более конкретную проверку типа для захваченного аргумента.Начиная с Mockito 2.0 есть также возможность использовать статический метод Matchers.argThat (ArgumentMatcher) . С помощью Java 8 теперь стало намного чище и удобнее писать:
Если вы привязаны к более низкой версии Java, это тоже неплохо:
Конечно, никто из них не может проверить порядок звонков - для чего вы должны использовать InOrder :
Пожалуйста, взгляните на проект mockito-java8, который позволяет совершать такие звонки, как:
источник
CharSequence
. Знаете ли вы какой-нибудь способ заставить отчет правильно распечатать искомый аргумент?Если вы не хотите проверять все звонки
doSomething()
, только последний, вы можете просто использоватьArgumentCaptor.getValue()
. Согласно сообщению Mockito Javadoc :Если метод был вызван несколько раз, он возвращает последнее захваченное значение
Так что это будет работать (предполагается, что
Foo
есть методgetName()
):источник
Вы также можете использовать аннотированный @Captor ArgumentCaptor. Например:
источник
С лямбдами Java 8 удобным способом является использование
источник
Прежде всего: вы всегда должны импортировать mockito static, таким образом, код будет намного более читабельным (и интуитивно понятным) - примеры кода ниже требуют его работы:
В методе verify () вы можете передать ArgumentCaptor для обеспечения выполнения в тесте и ArgumentCaptor для оценки аргументов:
Список всех переданных аргументов во время теста доступен через метод arguments.getAllValues ().
Значение единственного (последнего вызванного) аргумента доступно через arguments.getValue () для дальнейшей манипуляции / проверки или всего, что вы хотите сделать.
источник