Детали ошибки:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
мой код:
@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
.updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
.thenReturn(false);
Как вы можете видеть, я звоню when
на updateItemAttributes
(что делает возвращающие boolean
) не на updateItemAttributesByJuId
.
- Почему Mockito пытается вернуть
boolean
изupdateItemAttributesByJuId
? - Как это исправить?
@Repository
метода Spring DAO с @Aspect . если даwhen(someDao.someMethod()).thenReturn(List<xxx>)
, то получу исключение WrongTypeOfReturnValue. Благодаря отладке я вижу, чтоsomeMethod
метод действительно был вызван в приведенном выше заявлении и запускает Around Advice и возвращает,null
но Mockito ожидаетList<xxx>
.Другая причина подобного сообщения об ошибке - попытка имитировать
final
метод. Не следует пытаться высмеивать окончательные методы (см последний метод насмешки ).Я также столкнулся с ошибкой в многопоточном тесте. Ответ gna работал в этом случае.
источник
Очень интересная проблема. В моем случае эта проблема возникла, когда я попытался отладить свои тесты в этой аналогичной строке:
Важно отметить, что тесты выполнялись правильно без отладки.
В любом случае, когда я заменил приведенный выше код фрагментом кода ниже, я смог без проблем отладить проблемную строку.
источник
Для меня это означало, что я выполнял это:
a = Mockito.mock(SomeClass.class); b = new RealClass(); when(b.method1(a)).thenReturn(c); // within this method1, it calls param1.method2() -- note, b is not a spy or mock
Так что же происходит, что Mockito обнаруживал , что
a.method2()
в настоящее время называется, и говорил мне , что я не мог вернутьсяc
изa.method2()
которых является неправильным.Исправление: используйте
doReturn(c).when(b).method1(a)
синтаксис стиля (вместоwhen(b.method1(a)).thenReturn(c);
), который поможет вам более кратко и быстро обнаружить скрытую ошибку.Или в этом конкретном случае, после этого он начал показывать более точное «NotAMockException», и я изменил его, чтобы больше не пытаться установить возвращаемое значение из немодельного объекта.
источник
У меня недавно была эта проблема. Проблема заключалась в том, что метод, который я пытался имитировать, не имел модификатора доступа. Добавление паблика решило проблему.
источник
У меня была эта ошибка, потому что в моем тесте у меня было два ожидания: одно от макета, а другое от конкретного типа
MyClass cls = new MyClass(); MyClass cls2 = Mockito.mock(Myclass.class); when(foo.bar(cls)).thenReturn(); // cls is not actually a mock when(foo.baz(cls2)).thenReturn();
Я исправил это, изменив cls на макет
источник
В моем случае проблема была вызвана попыткой имитировать статический метод и забыть вызвать
mockStatic
класс. Также я забыл включить класс в@PrepareForTest()
источник
Если вы используете аннотации, возможно, вам нужно использовать @Mock вместо @InjectMocks. Потому что @InjectMocks вместе работает как @Spy и @Mock. А @Spy отслеживает недавно выполненные методы, и вы можете почувствовать, что возвращаются / подкладываются неверные данные.
источник
@InjectMocks
работает как@Spy
и@Mock
вместе". <- мне это кажется неправильным. Откуда вы это слышали?В моем случае я использовал оба
@RunWith(MockitoJUnitRunner.class)
иMockitoAnnotations.initMocks(this)
. Когда я удалил,MockitoAnnotations.initMocks(this)
все заработало правильно.источник
Ошибка:
Фактический код:
@RunWith(PowerMockRunner.class) @PrepareForTest({ Object.class, ByteString.class}) @Mock private ByteString mockByteString; String testData = “dsfgdshf”; PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); // throws above given exception
Решение для устранения этой проблемы:
1-й Удалите аннотацию «@Mock».
private ByteString mockByteString;
2-е добавление
PowerMockito.mock
источник
Недавно я столкнулся с этой проблемой, когда издевался над функцией в классе данных Kotlin . По неизвестной причине один из моих тестовых прогонов оказался в зависшем состоянии. Когда я снова запустил тесты, некоторые из моих тестов, которые были пройдены ранее, начали давать сбой с
WrongTypeOfReturnValue
исключением.Я убедился, что использую,
org.mockito:mockito-inline
чтобы избежать проблем с финальными классами (упомянутыми Arvidaa), но проблема осталась. Для меня это решило убить процесс и перезапустить Android Studio . Это прервало мой замороженный тестовый прогон, и следующие тестовые прогоны прошли без проблем.источник
Отсутствует @MockBean на bean-компоненте, над которым вы хотите издеваться
источник
У
WrongTypeOfReturnValue
меня возникла эта проблема, потому что я издевался над методом, возвращающимjava.util.Optional;
a,com.google.common.base.Optional;
из-за того, что мой форматировщик автоматически добавляет недостающие импорты.Mockito просто говорил мне, что «метод something () должен возвращать Optional» ...
источник
В моем случае bean-компонент был инициализирован с использованием аннотации @Autowired вместо @MockBean
Таким образом, издевательство над DAO и службами вызывает такое исключение.
источник
Для меня проблема заключалась в многопоточных тестах, которые выполняли заглушку / проверку общих моков. Это привело к случайному выбрасыванию
WrongTypeOfReturnValue
исключения.Это неправильно написанный тест с использованием Mockito. К мокам нельзя обращаться из нескольких потоков.
Решением было сделать mocks локальными для каждого теста.
источник
TL; DR Если некоторые аргументы в вашем тесте есть
null
, обязательно имитируйте вызов параметра с помощьюisNull()
вместоanyXXX()
.Я получил эту ошибку при обновлении Spring boot 1.5.x до 2.1.x. Spring boot поставляется с собственным Mockito, который теперь также обновлен до 2.x (см., Например, « Зависимости Spring boot 2.1.2» ).
Mockito изменилось поведение для
anyXXX()
метода, гдеXXX
находитсяString
,Long
и т.д. Вот является Javadoc изanyLong()
:Я предлагаю вам отладить до того момента, когда ваш макет будет вызван, и проверьте, является ли хотя бы один аргумент
null
. В этом случае убедитесь, что вы подготовить макет сisNull()
вместо напримерanyLong()
.Итак, это:
становится:
источник
Это мой случай:
//given ObjectA a = new ObjectA(); ObjectB b = mock(ObjectB.class); when(b.call()).thenReturn(a); Target target = spy(new Target()); doReturn(b).when(target).method1(); //when String result = target.method2();
Затем я получаю такую ошибку:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2() method2() should return String
Вы можете догадаться?
Проблема в том, что Target.method1 () - статический метод. Мокито полностью предупреждает меня о другом.
источник