Mockito Exception - when() requires an argument wh

2019-01-25 02:01发布

I have a very simple test case that is using Mockito and Spring Test framework. When I do

when(pcUserService.read("1")).thenReturn(pcUser);

I get this exception.

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.

    at com.project.cleaner.controller.test.PcUserControllerTest.shouldGetPcUser(PcUserControllerTest.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

I have tried with different methods but keep on getting this error message. I am using Spring 3.1.0.RELEASE with Mockito. Please share and guide me in the right direction.

6条回答
Luminary・发光体
2楼-- · 2019-01-25 02:21

In case others hit this issue....

It could also be the case that the method you are trying to mock out,pcUserService.read, is declared as a final method. From what I've noticed this appears to cause issues with Mockito.

查看更多
对你真心纯属浪费
3楼-- · 2019-01-25 02:28

Another solution to this issue might be that in case of a test class that is using PowerMockRunner, you might have to add the class that you are mocking to the list, in @PrepareForTest annotation.

For instance -

@PrepareForTest({ PcUserService.class })

查看更多
Rolldiameter
4楼-- · 2019-01-25 02:31

There's another possible reason for such error - sometimes IDE prefers to statically import Mockito.when() from another package:

import static io.codearte.catchexception.shade.mockito.Mockito.when;

vs

import static org.mockito.Mockito.when; //should normally use this one

The thing is 'when' from io.codearte package is compliant with org.mockito.Mockito.any() on compilation level, but fails during runtime with that exact same error message.

查看更多
萌系小妹纸
5楼-- · 2019-01-25 02:35

You need to create a MOCK of pcUserService first, and then use that mock.

PcUserService mock = org.mockito.Mockito.mock(PcUserService.class);
when(mock.read("1")).thenReturn(pcUser);
查看更多
在下西门庆
6楼-- · 2019-01-25 02:35

I had the same issue, the method that I was trying to mock it was a final method. I removed the modifier and it worked fine.

查看更多
小情绪 Triste *
7楼-- · 2019-01-25 02:41

If you use Kotlin, you should know that methods are final by default. So write open fun instead of fun. Thanks to @djkelly99 for a tip.

查看更多
登录 后发表回答