模棱两可的Mockito - 期望0匹配,1记录(InvalidUseOfMatchersException)

时间:2015-10-22 09:06:05

标签: java junit mocking mockito

我面临一个非常奇怪的问题。

 URL = "/my/specific/url/";
 when(this.restHelperMock.post(
 eq(myEnum),
 eq(this.config.apiEndpoint() + URL),
 any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent));

或甚至包含

 URL = "/my/specific/url/";
 when(this.restHelperMock.post(
 eq(myEnum),
 contains(this.config.apiEndpoint() + URL),
 any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent));

给了我

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

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

即使我不使用RAW表达式 奇怪的是,如果我将contains方法更改为:

URL = "/my/specific/url/";
 when(this.restHelperMock.post(
 eq(myEnum),
 contains(URL),
 any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent));

省略端点,它可以工作。

Config和RestHelper都被嘲笑:

this.restHelperMock = mock(RESTHelper.class);
this.config = mock(MyBMWConfiguration.class);

when(this.config.apiEndpoint()).thenReturn("http://host:port/api");

ApiEndpoint的URL等于我想要模拟的内容, 即使它不会,我应该得到一个NullpointerException,因为虚假的嘲弄。 但在这里我没有任何想法。

感谢您的回答。

1 个答案:

答案 0 :(得分:7)

问题似乎是您在this.config.apiEndpoint()调用期间调用了模拟方法eq ( ... )。尝试简单地将完整的URL放在那里(host:port / api / my / specific / url),而不是在那里调用另一个模拟,这可能会混淆Mockito,因为它依赖于内部状态进行模拟。

老实说,我对Mockito并不是那么深刻,我可以解释为什么会发生这种情况,但有一天我可能会尝试调试它; - )

编辑:奇怪的是,我似乎无法用更简单的测试用例重现它。这里似乎有更多的东西,而不是眼睛。