Я использую Mockito 1.9.0. Я хочу смоделировать поведение для одного метода класса в тесте JUnit, поэтому у меня есть
final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);
Проблема в том, что во второй строке myClassSpy.method1()
действительно вызывается, что приводит к исключению. Единственная причина, по которой я использую mocks, заключается в том, что позже, при каждом myClassSpy.method1()
вызове, реальный метод не будет вызываться и myResults
объект будет возвращен.
MyClass
является интерфейсом и myInstance
является реализацией этого, если это имеет значение.
Что мне нужно сделать, чтобы исправить это шпионское поведение?
Ответы:
Позвольте мне процитировать официальную документацию :
В вашем случае это выглядит примерно так:
источник
send
Мой случай отличался от принятого ответа. Я пытался смоделировать закрытый для пакета метод для экземпляра, который не жил в этом пакете
и тестовые занятия
Компиляция верна, но когда он пытается настроить тест, он вместо этого вызывает реальный метод.
Объявление метода защищенным или публичным устраняет проблему, но это не чистое решение.
источник
В моем случае, используя Mockito 2.0, мне пришлось изменить все
any()
параметрыnullable()
, чтобы заглушить реальный вызов.источник
foo = Mockito.spy(foo);
Mockito.doReturn(someValue).when(foo).methodToPrevent(nullable(ArgumentType.class));
any
и сeq
соответствиями.Кажется, что ответ Томаша Нуркевича не рассказывает всей истории!
NB Mockito версия: 1.10.19.
Я очень новичок в Mockito, поэтому не могу объяснить следующее поведение: если есть эксперт, который может улучшить этот ответ, пожалуйста, не стесняйтесь.
Метод здесь идет речь,
getContentStringValue
является НЕfinal
и НЕstatic
.Эта строка делает вызвать оригинальный метод
getContentStringValue
:Эта строка не вызывает оригинальный метод
getContentStringValue
:По причинам, на которые я не могу ответить, использование
isA()
приводит к тому, что предполагаемое (?) Поведение «не вызывать метод» приводитdoReturn
к сбою.Давайте посмотрим на сигнатуры методов, задействованных здесь: они оба являются
static
методамиMatchers
. Оба говорят, что Javadoc возвращаютсяnull
, что немного трудно заставить себя задуматься. ПредположительноClass
объект, переданный в качестве параметра, проверяется, но результат либо никогда не вычисляется, ни отбрасывается. Учитывая, что этоnull
может означать любой класс, и что вы надеетесь, что смоделированный метод не будет вызван, не могли ли подписиisA( ... )
иany( ... )
просто вернуть,null
а не универсальный параметр *<T>
?Тем не мение:
Документация по API не дает никакой подсказки по этому поводу. Также кажется, что потребность в таком поведении «не вызывать метод» является «очень редкой». Лично я использую эту технику все время : обычно я нахожу, что насмешка включает в себя несколько строк, которые "устанавливают сцену" ... после чего вызывается метод, который затем "проигрывает" сцену в контексте имитации, который вы поставили ... ... и пока вы настраиваете декорации и декорации, последнее, что вам нужно, это чтобы актеры вышли на сцену слева и начали отыгрывать свои сердца ...
Но это намного выше моей зарплаты ... Я приглашаю объяснения от любых проходящих первосвященников Мокито ...
* Является ли "универсальный параметр" правильным термином?
источник
Еще один возможный сценарий , который может вызывают проблемы со шпионами, когда вы тестируете весной боб (с пружинными тестовой структурой) или какой - либо другой структурой, которая proxing ваших объектов во время испытания .
пример
В приведенном выше коде Spring и Mockito будут пытаться проксировать ваш объект MonitoringDocumentsRepository, но Spring будет первым, что вызовет реальный вызов метода findMonitoringDocuments. Если мы отладим наш код сразу после установки шпиона на объект репозитория, он будет выглядеть так внутри отладчика:
@SpyBean на помощь
Если вместо
@Autowired
аннотации мы используем@SpyBean
аннотацию, мы решим вышеуказанную проблему, аннотация SpyBean также внедрит объект репозитория, но он будет сначала прокси-сервером Mockito и будет выглядеть так внутри отладчика.и вот код:
источник
Я нашел еще одну причину для шпиона вызывать оригинальный метод.
У кого-то возникла идея издеваться над
final
классом, и он узнал оMockMaker
:Источник: https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#mock-the-unmockable-opt-in-mocking-of-final-classesmethods
После того, как я слил этот файл и перенес его на мою машину, мои тесты не прошли.
Я просто должен был удалить строку (или файл), и
spy()
работал.источник
Немного опоздал на вечеринку, но вышеприведенные решения у меня не сработали, поэтому делюсь своими 0,02 $
Версия Mokcito: 1.10.19
MyClass.java
Test.java
Следующее НЕ работает для меня (фактический метод вызывался):
1.
2.
3.
После РАБОТЫ:
источник
Один из способов убедиться, что метод из класса не вызывается, - переопределить метод фиктивной переменной.
источник
Ответ для пользователей scala: даже не ставить на
doReturn
первое место не получится! Смотрите этот пост .источник