Подтвердить что ты не робот

При запуске теста mockito происходит ошибка WrongTypeOfReturnValue

Подробности ошибки:

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 (который возвращает a boolean), а не на updateItemAttributesByJuId.

  • Почему Mockito пытается вернуть boolean из updateItemAttributesByJuId?
  • Как это можно исправить?
4b9b3361

Ответ 2

Другая причина аналогичного сообщения об ошибке заключается в том, чтобы издеваться над методом final. Не следует пытаться высмеять окончательные методы (см. Окончательный метод, издевательский).

Я также столкнулся с ошибкой в ​​многопоточном тесте. Ответ gna работал в этом случае.

Ответ 3

Очень интересная проблема. В моем случае эта проблема была вызвана, когда я попытался отладить мои тесты на этой аналогичной строке:

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

Важно отметить, что тесты выполнялись правильно без отладки.

В любом случае, когда я заменил выше код ниже фрагментом кода, я смог без проблем отладить проблему.

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

Ответ 4

У меня недавно была эта проблема. Проблема заключалась в том, что метод, который я пытался высмеять, не имел модификатора доступа. Добавление общественности решило проблему.

Ответ 5

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

Ответ 6

У меня была эта ошибка, потому что в моем тесте у меня было два ожидания: один на макет и один на конкретный тип

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 как макет

Ответ 7

Для меня это означало, что я запускал это:

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() что неверно.

Fix: используйте синтаксис стиля doReturn(c).when(b).method1(a) (вместо того, чтобы when(b.method1(a)).thenReturn(c);), что поможет вам более скрытно обнаруживать скрытую ошибку и быстро.

Или в этом конкретном случае после этого он начал показывать более точное "NotAMockException", и я изменил его, чтобы больше не пытаться установить возвращаемое значение из немощного объекта.

Ответ 8

Если вы используете аннотации, возможно, вам нужно использовать @Mock вместо @InjectMocks. Поскольку @InjectMocks работает как @Spy и @Mock вместе. И @Spy отслеживает недавно выполненные методы, и вы можете почувствовать, что неверные данные возвращаются/подпадают.

Ответ 9

Ошибка:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Строка не может быть возвращена size()
size() должен возвращать int
***
Если вы не знаете, почему вы читаете выше, читайте дальше.
Из-за характера синтаксиса выше может возникнуть проблема, потому что:
1. Это исключение может иметь место в неправильно написанных многопоточных
тесты.
Пожалуйста, обратитесь к FAQ по Mockito по ограничениям тестирования параллелизма.
2. Шпион затуманивается, используя (spy.foo()). Then() синтаксис. Это безопаснее
шпионы -
- with 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

Решение проблемы:

1st Удалить аннотацию "@Mock".

private ByteString mockByteString;

2-й Добавить PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

Ответ 10

Недавно я столкнулся с этой проблемой, одновременно издеваясь над функцией в классе данных Kotlin. По какой-то неизвестной причине один из моих тестовых прогонов оказался в замороженном состоянии. Когда я снова запускал тесты, некоторые из моих тестов, которые ранее проходили, начали сбой с исключением WrongTypeOfReturnValue.

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

Ответ 11

Отсутствует @MockBean в бобе, который вы хотите издеваться

Ответ 12

В моем случае я использовал @RunWith(MockitoJUnitRunner.class) и MockitoAnnotations.initMocks(this). Когда я удалил MockitoAnnotations.initMocks(this), он работал правильно.

Ответ 13

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

Mockito просто говорил мне, что "method что-то() должно возвращать Optional"...

Ответ 14

Это мой случай:

//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() является статическим методом. Мокито полностью предупреждает меня о другом.