2012-06-20 2 views
34
детали

Ошибка:при запуске теста Mockito происходит WrongTypeOfReturnValue Exception

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. Как это можно исправить?

ответ

79

Согласно https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90, вы должны перефразировать ваш

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

в

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

Tks, мне это нравится, тогда хорошо работает –

+10

@confusedwindbell Рассмотрите вопрос о признании ответа, если он решил вашу проблему. –

+0

У меня была аналогичная ошибка, и это решение работает для меня. – YLombardi

20

Другая причина подобного сообщения об ошибке пытается высмеивать метод final. Не следует пытаться высмеять окончательные методы (см. Final method mocking).

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

+0

решил мой случай [+1] –

1

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

+1

«' InjectMocks' работает как '@ Spy' и' @ Mock' вместе. " <- это кажется мне неправильным. Откуда вы это слышали? –

2

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

2

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

0

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

MyClass cls = new MyClass(); 
MyClass cls2 = Mockito.mock(Myclass.class); 
when(foo.bar(cls)).thenReturn(); 
when(foo.baz(cls2)).thenReturn(); 

Я фиксированной, изменив CLS на быть макетным также

Смежные вопросы