我正在尝试模仿Spring的MessageSource.getMessage
方法,但是Mockito
它抱怨的是一条无用的消息,我正在使用:
when(mockMessageSource.getMessage(anyString(), any(Object[].class), any(Locale.class)))
.thenReturn(anyString());
错误消息是:
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
Also, this error might show up because you use argument matchers with methods
that cannot be mocked Following methods *cannot* be stubbed/verified: final/private/equals()
/hashCode().
知道我做错了吗?
答案 0 :(得分:3)
我认为问题在于,anyString()
是在thenReturn(...)
调用中用作参数时抱怨的匹配器。如果你不关心返回什么,只需返回一个空字符串la thenReturn("")
。
答案 1 :(得分:2)
虽然接受的答案有问题代码的修复,但我想注意,没有必要使用模拟库来创建始终返回空字符串的MessageSource
。 / p>
以下代码也是如此:
MessageSource messageSource = new AbstractMessageSource() {
protected MessageFormat resolveCode(String code, Locale locale) {
return new MessageFormat("");
}
};
答案 2 :(得分:1)
嗯,有一件事对我来说很奇怪:
您将返回Mockito.anyString()
这是Matcher
。
我认为你必须返回一个具体的字符串。
when(mockMessageSource.getMessage(anyString(), any(Object[].class), any(Locale.class)))
.thenReturn("returnValue");
答案 3 :(得分:1)
这里的问题是你需要从mock中返回一些与方法的返回类型匹配的实际对象。 与:比较:
when(mockMessageSource.getMessage(anyString(), any(Object[].class), any(Locale.class))).
thenReturn("A Value that I care about, or not");
这指出的更大问题是你真的没有测试任何行为。您可能想要考虑此测试提供的值。为什么要首先模拟对象?
答案 4 :(得分:1)
Mockito.when(messageSource.getMessage(Mockito.anyString(), Mockito.any(),Mockito.any(Locale.class))).thenReturn("Error Message");
这将为您提供帮助
答案 5 :(得分:0)
我只通过监视MessageSource解决了这个问题(所以我以后仍然可以验证getMessage调用)并将标志“useCodeAsDefaultMessage
”设置为true。
在这种情况下,AbstractMessageSource#getMessage
的后备机制将完成其工作,并将提供的密钥作为消息返回。
messageSource = spy(new ReloadableResourceBundleMessageSource());
messageSource.setUseCodeAsDefaultMessage(true);
答案 6 :(得分:0)
getMessage方法是最终的