Mock Spring的MessageSource.getMessage方法

时间:2013-10-18 18:53:12

标签: java spring junit mockito

我正在尝试模仿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().

知道我做错了吗?

7 个答案:

答案 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)

类ResourceBundleMessageSource上的

getMessage方法是最终的