при запуску тесту mockito виникає виняток WrongTypeOfReturnValue


96

Детальна інформація про помилку:

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.

  1. Чому Mockito намагається повертати booleanз updateItemAttributesByJuId?
  2. Як це можна виправити?

Відповіді:


198

Відповідно до https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90 , вам слід переформулювати

when(bar.getFoo()).thenReturn(fooBar)

до

doReturn(fooBar).when(bar).getFoo()

3
Це чудова порада. У мене також виникала ця проблема під час тестування @Repositoryметоду Spring DAO за допомогою @Aspect . якщо я це роблю when(someDao.someMethod()).thenReturn(List<xxx>), я отримав цей виняток WrongTypeOfReturnValue. Через налагодження я бачу, що someMethodметод насправді був викликаний у наведеному вище твердженні і запускає Around Advice та повертає a, nullале Mockito очікує a List<xxx>.
LeOn - Han Li

Випрацювали для мене. Обрігадо!
саксофоніст

Відмінна відповідь. Це врятувало мій день.
user3198259

Працював також у мене! Дякую! Хоча, я не повністю зрозумів пояснення у наданому посиланні.
georgeliatsos

40

Ще однією причиною подібного повідомлення про помилку є спроба знущатися над finalметодом. Не слід намагатися глузувати з остаточних методів (див. Кінцевий метод знущань ).

Я також зіткнувся з помилкою в багатопотоковому тесті. Відповідь gna спрацювала в такому випадку.


20

Дуже зацікавлена ​​проблема. У моєму випадку ця проблема виникла, коли я намагався налагодити свої тести за таким же рядком:

Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);

Важливо, що тести працювали правильно без налагодження.

У будь-якому випадку, коли я замінив наведений вище код на наведений нижче фрагмент коду, я зміг без проблем налагодити рядок проблеми.

doReturn(fooBar).when(bar).getFoo();

Дякую, схоже, є однакова проблема з класами даних Kotlin, як і поля, і ваше рішення це вирішило!
Mohsen Mirhoseini

6

Для мене це означало, що я запускаю це:

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", і я змінив його, щоб більше не намагатися встановити значення, що повертається, з непромислового об'єкта.


1
Та сама помилка, яку я теж зробив. Я висміяв метод, використаний у методі1, виконав і отримав цей виняток. Це було вирішено після того, як я видалив цей код.
Praveen.883,

5

Нещодавно у мене було це питання. Проблема полягала в тому, що метод, над яким я намагався знущатися, не мав модифікатора доступу. Додавання публіки вирішило проблему.


5

У мене була ця помилка, тому що в моєму тесті я мав два очікування, одне - на фіктивний, а інше - на конкретний тип

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, щоб він також був знущанням


4

У моєму випадку проблема була викликана спробою знущання над статичним методом та забуттям викликати mockStaticклас. Також я забув включити клас до@PrepareForTest()


2

Якщо ви використовуєте анотації, можливо, вам потрібно буде використовувати @Mock замість @InjectMocks. Оскільки @InjectMocks працює як @Spy та @Mock разом. А @Spy відстежує нещодавно запущені методи, і ви можете відчути, що неправильні дані повертаються / передаються.


2
" @InjectMocksпрацює як @Spyі @Mockразом". <- це здається мені неправильним. Звідки ти це чув?
Етьєн Мірет

2

У моєму випадку я використовував обидва @RunWith(MockitoJUnitRunner.class)і MockitoAnnotations.initMocks(this). Коли я видалив, MockitoAnnotations.initMocks(this)це працювало правильно.


1

Помилка:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Рядок неможливо повернути за розміром ()
size () повинен повертати int
***
Якщо ви не впевнені, чому у вас з’являється помилка читання далі.
Через природу синтаксису вищезазначена проблема може виникнути через:
1. Цей виняток може виникнути в неправильно написаних багатопотокових
тестах.
Будь ласка, зверніться до поширених запитань щодо Mockito щодо обмежень тестування паралельності.
2. Шпигун заглушається, використовуючи синтаксис (spy.foo ()). Then (). Безпечніше заглушати
шпигунів -
- із сімейством методів doReturn | Throw (). Більше в javadocs для
методу Mockito.spy ().

Фактичний код:

@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

mockByteString = PowerMockito.mock(ByteString.class);

1

Нещодавно я зіткнувся з цією проблемою, висміюючи функцію в класі даних Kotlin . З якоїсь невідомої причини один із моїх тестових запусків опинився в замерзлому стані. Коли я знову запускав тести, деякі мої тести, які раніше проходили, почали давати збої за WrongTypeOfReturnValueвинятком.

Я переконався, що використовую, org.mockito:mockito-inlineщоб уникнути проблем із підсумковими заняттями (згадані Arvidaa), але проблема залишалася. Що для мене це вирішило, це вбити процес і перезапустити Android Studio . Це закінчило мій заморожений пробний запуск, і наступні пробні пробіги пройшли без проблем.


1

Відсутній @MockBean на зерні, над якою ви хочете знущатися


1

Я отримав цю проблему, WrongTypeOfReturnValueтому що знущався над методом, що повертає a java.util.Optional;з- com.google.common.base.Optional;за того, що мій програмувальник автоматично додає відсутні імпорти.

Мокіто мені просто казав, що "метод щось () повинен повернути необов’язково" ...


1

У моєму випадку компонент був ініціалізований за допомогою анотації @Autowired замість @MockBean

Тож таким чином знущання над DAO та Службами створює такий виняток


1
Так, у моєму випадку тестування служби додатків Spring-Boot, MockBean слід використовувати при знущанні над Bean. Дякую!
Ісаак Філіп

1

Для мене проблемою були багатопотокові тести, які виконували обробку / перевірку спільних макетів. Це призвело до хаотичного кидкаWrongTypeOfReturnValue винятку.

Це неправильно написаний тест за допомогою Mockito. До насмішок не можна звертатися з декількох потоків.

Рішенням було зробити припущення локальними для кожного тесту.


1

TL; DR Якщо деякі аргументи у вашому тесті є null, не забудьте знущатися над викликом параметра isNull()замість anyXXX().


Я отримав цю помилку під час оновлення з Spring boot 1.5.x до 2.1.x. Пружинне завантаження постачається із власним Mockito, який тепер також оновлений до 2.x (див., Наприклад, Залежності від Spring boot 2.1.2 )

Mockito змінилася поведінка для anyXXX()методу, де XXXзнаходиться String, Longі т.д. Ось є Javadoc з anyLong():

Оскільки Mockito 2.1.0, дозволити лише value Long, тому nullбільше не є дійсним значенням. Оскільки примітивні обгортки мають нульовий статус, пропонований API для відповідності null обгортці буде таким #isNull(). Ми вважали, що ця зміна зробить тести набагато безпечнішими, ніж це було з Mockito 1.x.

Я б запропонував вам налагодити до того моменту, коли ваш макет буде викликаний, і перевірити, чи є хоча б один аргумент null. У такому випадку переконайтесь, що ви підготували свій макет isNull()замість, наприклад anyLong().

Отже це:

when(MockedClass.method(anyString());

стає:

when(MockedClass.method(isNull());

-1

Це мій випадок:

//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 () є статичним методом. Мокіто повністю попереджає мене про інше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.