Ответ 1
Согласно https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90, вы должны перефразировать ваш
when(bar.getFoo()).thenReturn(fooBar)
к
doReturn(fooBar).when(bar).getFoo()
Подробности ошибки:
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
.
boolean
из updateItemAttributesByJuId
?Согласно https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90, вы должны перефразировать ваш
when(bar.getFoo()).thenReturn(fooBar)
к
doReturn(fooBar).when(bar).getFoo()
Другая причина аналогичного сообщения об ошибке заключается в том, чтобы издеваться над методом final
. Не следует пытаться высмеять окончательные методы (см. Окончательный метод, издевательский).
Я также столкнулся с ошибкой в многопоточном тесте. Ответ gna работал в этом случае.
Очень интересная проблема. В моем случае эта проблема была вызвана, когда я попытался отладить мои тесты на этой аналогичной строке:
Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);
Важно отметить, что тесты выполнялись правильно без отладки.
В любом случае, когда я заменил выше код ниже фрагментом кода, я смог без проблем отладить проблему.
doReturn(fooBar).when(bar).getFoo();
У меня недавно была эта проблема. Проблема заключалась в том, что метод, который я пытался высмеять, не имел модификатора доступа. Добавление общественности решило проблему.
В моем случае проблема была вызвана попыткой издеваться над статическим методом и забыть вызвать mockStatic
в классе. Также я забыл включить класс в @PrepareForTest()
У меня была эта ошибка, потому что в моем тесте у меня было два ожидания: один на макет и один на конкретный тип
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 как макет
Для меня это означало, что я запускал это:
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", и я изменил его, чтобы больше не пытаться установить возвращаемое значение из немощного объекта.
Если вы используете аннотации, возможно, вам нужно использовать @Mock вместо @InjectMocks. Поскольку @InjectMocks работает как @Spy и @Mock вместе. И @Spy отслеживает недавно выполненные методы, и вы можете почувствовать, что неверные данные возвращаются/подпадают.
Ошибка:
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);
Недавно я столкнулся с этой проблемой, одновременно издеваясь над функцией в классе данных Kotlin. По какой-то неизвестной причине один из моих тестовых прогонов оказался в замороженном состоянии. Когда я снова запускал тесты, некоторые из моих тестов, которые ранее проходили, начали сбой с исключением WrongTypeOfReturnValue
.
Я гарантировал, что использовал org.mockito:mockito-inline
чтобы избежать проблем с финальными классами (упоминается Arvidaa), но проблема осталась. Для меня это решило убить процесс и перезапустить Android Studio. Это завершило мой замороженный тестовый прогон, и следующие тестовые прогоны прошли без проблем.
Отсутствует @MockBean в бобе, который вы хотите издеваться
В моем случае я использовал @RunWith(MockitoJUnitRunner.class)
и MockitoAnnotations.initMocks(this)
. Когда я удалил MockitoAnnotations.initMocks(this)
, он работал правильно.
Я получил эту проблему WrongTypeOfReturnValue
, потому что я издевался над методом, возвращающим java.util.Optional;
с com.google.common.base.Optional;
из-за того, что мой форматтер автоматически добавляет отсутствующие импорта.
Mockito просто говорил мне, что "method что-то() должно возвращать Optional"...
Это мой случай:
//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() является статическим методом. Мокито полностью предупреждает меня о другом.