У меня есть вызов метода, который я хочу издеваться над mockito. Для начала я создал и внедрил экземпляр объекта, для которого будет вызван метод. Моя цель - проверить один из объектов в вызове метода.
Есть ли способ, которым mockito позволяет утверждать или проверять объект и его атрибуты при вызове метода mock?
пример
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Вместо того, чтобы делать, anyObject()
я хочу проверить, что объект аргумента содержит некоторые конкретные поля
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Ответы:
Новая функция, добавленная в Mockito, делает это еще проще,
Взгляните на документацию Mockito
В случае, когда имеется более одного параметра, и требуется захват только одного параметра, используйте другие ArgumentMatchers, чтобы обернуть остальные аргументы:
источник
Я думаю, что самый простой способ проверки объекта аргумента - использовать
refEq
метод:Его можно использовать, даже если объект не реализуется
equals()
, потому что используется отражение. Если вы не хотите сравнивать некоторые поля, просто добавьте их имена в качестве аргументовrefEq
.источник
Еще одна возможность, если вы не хотите использовать
ArgumentCaptor
(например, потому что вы также используете заглушку), это использовать Hamcrest Matchers в сочетании с Mockito.источник
Matchers
пакет корректен, так как написание одной и той же строки кода сorg.mockito.Matchers
классом вызывает ложное исключение, утверждающее, что параметр фиктивной функции просто не совпадает.MockitoHamcrest.argThat()
и неMockito.argThat()
Это ответ, основанный на ответе от iraSenthil, но с аннотацией ( Captor ). На мой взгляд, у него есть некоторые преимущества:
Пример:
источник
captor.getAllValues()
. Метод,captor.getValue()
который используется в ответе, дает последний результат.Если вы используете Java 8, вы можете использовать лямбда-выражения для соответствия.
Пример вызова
Дополнительная информация: http://source.coveo.com/2014/10/01/java8-mockito/
источник
Вышеуказанные решения не сработали в моем случае. Я не мог использовать ArgumentCaptor, так как метод вызывался несколько раз, и мне нужно было проверить каждый из них. Простой Matcher с "argThat" сделал свое дело легко.
Custom Matcher
Тест бегун
источник
И очень хорошее и чистое решение в Колтин от
com.nhaarman.mockito_kotlin
источник
Вы можете сослаться на следующее:
Это проверит, вызывается ли метод mockedObject с требуемым объектом в качестве параметра.
источник
Еще один простой способ сделать это:
источник
Javadoc для refEq упомянул, что проверка на равенство неглубока! Вы можете найти более подробную информацию по ссылке ниже:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...)][1]
Проблема "поверхностного равенства" не может контролироваться, когда вы используете другие классы, которые не реализуют метод .equals (), класс "DefaultMongoTypeMapper" является примером, где метод .equals () не реализован.
org.springframework.beans.factory.support предлагает метод, который может генерировать определение компонента вместо создания экземпляра объекта, и его можно использовать, чтобы избавиться от ошибки сравнения.
** "Определение компонента - это только описание компонента, а не сам компонент. Описания компонентов должным образом реализуют equals () и hashCode (), поэтому вместо создания нового DefaultMongoTypeMapper () мы предоставляем определение, которое сообщает Spring, как оно должен создать один
В вашем примере вы можете сделать что-то вроде этого
источник
Упрощенное решение без создания нового класса реализации Matcher и использования лямбда-выражения:
источник