Detalhe do erro:
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.
meu código:
@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
.updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
.thenReturn(false);
Como você pode ver, eu estou chamando when
on updateItemAttributes
(que faz retorno a boolean
) não no updateItemAttributesByJuId
.
- Por que Mockito está tentando retornar um
boolean
deupdateItemAttributesByJuId
? - Como isso pode ser corrigido?
@Repository
métodos Spring DAO com @Aspect . se eu fizerwhen(someDao.someMethod()).thenReturn(List<xxx>)
isso, recebo essa exceção WrongTypeOfReturnValue. Através da depuração, posso ver que osomeMethod
método foi realmente chamado na instrução acima e aciona o Around Advice e retorna um,null
mas Mockito está esperando umList<xxx>
.Outro motivo para mensagem de erro semelhante é tentar simular um
final
método. Não se deve tentar simular métodos finais (consulte Simulação do método final ).Também confrontei o erro em um teste multithread. A resposta por gna funcionou nesse caso.
fonte
Problema muito interessado. No meu caso, esse problema foi causado quando tentei depurar meus testes nesta linha semelhante:
A observação importante é que os testes foram executados corretamente sem depuração.
De qualquer forma, quando substituí o código acima pelo trecho de código abaixo, fui capaz de depurar a linha do problema sem problemas.
fonte
Para mim, isso significava que eu estava executando este:
Então, o que estava acontecendo é que Mockito foi detectar que
a.method2()
estava sendo chamado, e me dizendo que eu não poderia voltarc
a partir dea.method2()
que é errado.Correção: use a
doReturn(c).when(b).method1(a)
sintaxe de estilo (em vez dewhen(b.method1(a)).thenReturn(c);
), que o ajudará a descobrir o bug oculto de forma mais concisa e rápida.Ou, neste caso específico, depois de fazer isso, ele começou a mostrar a "NotAMockException" mais precisa e eu mudei para não mais tentar definir um valor de retorno de um objeto não simulado.
fonte
Recentemente tive esse problema. O problema era que o método que eu estava tentando simular não tinha modificador de acesso. Adicionar público resolveu o problema.
fonte
Eu tive esse erro porque em meu teste eu tinha duas expectativas, uma em uma simulação e outra em concreto
Consertei alterando cls para ser uma simulação também
fonte
No meu caso, o problema foi causado por tentar simular um método estático e esquecer de chamar
mockStatic
a classe. Também esqueci de incluir a classe no@PrepareForTest()
fonte
Se você estiver usando anotações, pode ser necessário usar @Mock em vez de @InjectMocks. Porque @InjectMocks funciona como @Spy e @Mock juntos. E @Spy mantém registro de métodos executados recentemente e você pode sentir que dados incorretos são retornados / substituídos.
fonte
@InjectMocks
funciona como@Spy
e@Mock
junto." <- isso parece errado para mim. De onde você ouviu isso?No meu caso, estava usando ambos
@RunWith(MockitoJUnitRunner.class)
eMockitoAnnotations.initMocks(this)
. Quando removiMockitoAnnotations.initMocks(this)
, funcionou corretamente.fonte
No meu caso, o bean foi inicializado usando a anotação @Autowired em vez de @MockBean
Portanto, desta forma, zombar de DAOs e serviços lança tal exceção
fonte
Erro:
Código real:
Solução para corrigir esse problema:
1. Remova a anotação “@Mock”.
2º Adicionar
PowerMockito.mock
fonte
Recentemente, encontrei esse problema ao simular uma função em uma classe de dados Kotlin . Por alguma razão desconhecida, uma das minhas execuções de teste acabou em um estado congelado. Quando eu executei os testes novamente, alguns dos meus testes que haviam passado anteriormente começaram a falhar com a
WrongTypeOfReturnValue
exceção.Garanti que estava usando
org.mockito:mockito-inline
para evitar os problemas com as aulas finais (mencionadas pela Arvidaa), mas o problema permaneceu. O que resolveu para mim foi interromper o processo e reiniciar o Android Studio . Isso encerrou minha execução de teste congelada e as execuções de teste a seguir foram aprovadas sem problemas.fonte
Falta @MockBean no bean que você deseja simular
fonte
Eu tenho esse problema
WrongTypeOfReturnValue
porque simulei um método que retorna umjava.util.Optional;
com umcom.google.common.base.Optional;
devido ao meu formatador adicionar automaticamente as importações ausentes.Mockito estava me dizendo que "método something () deve retornar opcional" ...
fonte
Para mim, o problema eram os testes multithread que faziam stub / verificação em simulações compartilhadas. Isso levou a uma
WrongTypeOfReturnValue
exceção aleatória .Este não é um teste escrito corretamente usando Mockito. Mocks não devem ser acessados de vários threads.
A solução foi fazer simulações locais para cada teste.
fonte
TL; DR Se alguns argumentos em seu teste forem
null
, certifique-se de simular a chamada de parâmetro com emisNull()
vez deanyXXX()
.Recebi este erro ao atualizar do Spring boot 1.5.x para 2.1.x. O Spring boot vem com seu próprio Mockito, que agora também é atualizado para 2.x (consulte, por exemplo, Dependências do Spring boot 2.1.2 )
Mockito mudou o comportamento para o
anyXXX()
método, ondeXXX
éString
,Long
etc. Aqui está o javadoc deanyLong()
:Eu sugiro que você depure até o ponto em que sua simulação está prestes a ser chamada e inspecione se pelo menos um argumento é
null
. Nesse caso, certifique-se de preparar sua simulação com, emisNull()
vez de, por exemploanyLong()
.Então, é isso:
torna-se:
fonte
Este é o meu caso:
Então recebo este erro:
Você consegue adivinhar?
O problema é que Target.method1 () é um método estático. Mockito me avisa completamente para outra coisa.
fonte