简体   繁体   中英

invalid matchers when mocking

I want to test this method :

public void some_method(SomeFactory someFactory) {
        A a = someFactory.populateWithParameter(parameter1, parameter2, parameter3, parameter4); 
        a.method_call();
        ....   
    }

the factory goes this way

public class SomeFactory(){

 // some constructor
public A populateWithParameter(SomeClass1 someClass1, SomeClass2 someClass2, String string, int parameter){
 return new A(someClass1, someClass2, string, parameter)
} 
}

and the test is

public void testSomeMethod() throws Exception {
        SomeFactory someFactory = mock(SomeFactory.class);
        when(someFactory.populateWithParameter(
                any(SomeClass1.class), any(SomeClass2.class),
             anyString(), anyInt())).thenReturn(notNull());

        mainActivity.some_method(someFactory);
...
    }

I get this message

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
4 matchers expected, 1 recorded:

You aren't allowed to use notNull() as a return value. Mockito matchers only stand in for arguments in calls to when and verify , and cannot work as return values. In particular, notNull() will actually return null and mark the "not null" match as a side-effect on a hidden stack, where it lingers until you interact with the mock next (when you actually invoke some_method ).

Though you didn't list your stack trace for your InvalidUseOfMatchersException , I'll bet that the error actually happens when you invoke populateWithParameter via some_method , not when you stub populateWithParameter . The "1 recorded" matcher is notNull() , where "4 matchers expected" refer to the number of arguments in the method call. The error message is really tailored for a case where you forget to use a matcher for some argument, like populateWithParameter(any(), any(), anyString(), 42) , which is a very common mistake.

Though I see in the comments that "it does not work!" when you try to return an instance, I can guarantee that returning notNull() absolutely will cause a problem, whereas returning an instance may simply reveal a different problem. You may want to update your question with the full stack trace after switching to returning an instance, or ask a new question.

For more information about Mockito matchers behind the scenes, see my question/answer here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM