添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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.

I've the same problem, but I'm using: @Autowired @ReplaceWithMock(beanName="logDao") private LogDao logDaoMock; – Marcin Erbel Dec 23, 2013 at 9:36

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);
                @eatSleepCode: the REAL method PcUserService.read gets never invoke in this example. Instead an Mockito Mock gets invoked, and this mock return pcUser
– Ralph
                Jun 10, 2014 at 13:43
                yes, I am facing a issue with this, I have a service lets say TestService and it has a method testMethod() and code inside testMethod includes call to another service method for eg.   AnotherTestService.getData(). So in my case I am not able to mock AnotherTestService what should I do?
– eatSleepCode
                Jun 11, 2014 at 4:52
                @eatSleepCode: Maybe you should have a look at this answer: stackoverflow.com/a/20856647/280244
– Ralph
                Jun 11, 2014 at 5:33
                @amdev Don't make pcUserService.read final :)  Not ideal I know, but there's not a whole lot you can do about it.  Mockito can't mock a final method.  See stackoverflow.com/questions/3793791/final-method-mocking for more detail and possible workarounds
– djkelly99
                Jul 24, 2018 at 21:37
                Actually, sometimes you don't mock your own class but some class from an external dependencies. But it's ok I found how to mock final method with mockito stackoverflow.com/questions/14292863/…
– amdev
                Jul 25, 2018 at 7:32
                Thank this worked. But 1 question. How would I solve this issue without making the method and class as open
– viper
                Oct 2, 2019 at 5:27
                @viper, thanks! I don't use tests now, but suppose, you should use newer version of this library. If I am not mistaken, it supports final methods. Probably you can try to create interfaces or abstract classes.
– CoolMind
                Oct 2, 2019 at 7:09
                I have latest version of mockito but I am still having the issue. What are the drawbacks of using an open modifier?
– viper
                Oct 2, 2019 at 7:12
                @viper, see stackoverflow.com/questions/14292863/…, github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2, github.com/powermock/powermock/wiki/mockito.
– CoolMind
                Oct 2, 2019 at 7:16
                @viper, it means that descendants of your open class may change a behavior in a way you didn't expect. Overriden methods can access those collections you didn't want to access. Or even change collections, objects. See also quora.com/What-are-all-the-advantages-of-inheritance-in-Java, quora.com/What-are-the-disadvantages-of-inheritance-in-Java.
– CoolMind
                Oct 2, 2019 at 7:27

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 })

Thanks, I thought I had, but I actually added the interface to the @preparefortest list, not the class, this answer made me double check there. – lauksas Dec 30, 2021 at 11:36

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;
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.

If you get this exception when using MockedStatic or Mockito.mockStatic, it can also mean that you are mixing matchers and literals in the call to the static method.

Try changing any mixes like YourClass.staticMethod(any(), "literal") to YourClass.staticMethod(any(), eq("literal"))

Basically You need to use the PowerMockito.mockStatic to enable static mocking for all static methods of a class. This means make it possible to stub them using the when-thenReturn syntax. For example: PowerMockito.mockStatic(TestClass.class); when(TestClass.getString()).thenReturn("HelloWorld!"); Note: you have to add @PrepareForTest({ TestClass.class }) to your unit test class.

When I got this exception, I was using @InjectMocks on the class that I needed to have the @Mock objects injected into (via constructor injection).

AFter much searching, I finally stumbled across this article:

https://mkyong.com/spring-boot/mockito-when-requires-an-argument-which-has-to-be-a-method-call-on-a-mock/

The key part to take away from it is (from the article):

When Mockito see this @InjectMocks, it doesn’t mock it, it just creates a normal instance, so the when() will be failed.

So this make this exception message I was getting

when() requires an argument which has to be 'a method call on a mock'.

make sense now; you aren't using when on an actual mock but an actual instance.

The link also provides the solution to the problem:

To solve it, annotate @Spy to mock it partially.

On top of @InjectMocks, put @Spy.

As a side note, if you try to make it a Mock by putting @Mock on top of @InjectMocks, you will get exception:

org.mockito.exceptions.base.MockitoException: This combination of annotations is not permitted on a single field: @Mock and @InjectMocks

Using @Spy on top of @InjectMocks solved the problem for me.

I faced same issue and it was because the mocked object is defined as @Beanand the overriden @Bean in the test was not working because of a missing spring property value

@Bean
@Primary
public JwtTokenUtil jwtTokenUtil() {
    return Mockito.mock(JwtTokenUtil.class);
@Autowired
private JwtTokenUtil jwtTokenUtil;
when(jwtTokenUtil.validateToken(jwtToken)).thenReturn(true);

spring.main.allow-bean-definition-overriding=true in application-test.properties

if anything above answers your case, then check that you did missed the @Test annotation for your test method.

@Test
public void my_test_method(){

just quoting, as this was my case. just missed the annotation.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.