Mockito和ReloadableResourceBundleMessageSource合得不好?

问题描述 投票:2回答:3

我有这个简单的测试,它甚至不是测试,因为我只是想模拟messagesource。

我收到这个错误:

org.springframework.context.NoSuchMessageException: No message 
found under code '' for locale 'null'.

其他人可以验证这种行为吗?

这是我设置的最小弹簧靴骨架测试,因为ReloadableResourceBundleMessageSource在另一个项目中不起作用,所以我想我会尽可能以最小的单位尝试它。

@RunWith(MockitoJUnitRunner.class)
public class DemoApplicationTests {

    @Test
    public void contextLoads() {

    ReloadableResourceBundleMessageSource messageSource = 
    mock(ReloadableResourceBundleMessageSource.class);
    when(
       messageSource.getMessage(
           anyString(), 
           any(Object[].class), 
           any(Locale.class)
         )
       ).thenReturn("returnValue");

    System.out.println("test");

    } 
}

这是我得到的错误:

org.springframework.context.NoSuchMessageException: No message 
found under code '' for locale 'null'.

at org.springframework.context.support.AbstractMessageSource.getMessage(
AbstractMessageSource.java:159)
at com.example.DemoApplicationTests.contextLoads(
DemoApplicationTests.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at ....
....
....
....
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(
JUnit4IdeaTestRunner.java:117)
at com.intellij.rt.execution.junit.JUnitStarter.
prepareStreamsAndStart(
JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(
JUnitStarter.java:74)

在我看来,它无法正确模拟它。我也试图嘲笑MessageSource界面无济于事。

java unit-testing junit mockito
3个回答
2
投票

正如大卫华莱士所说:

Mockito不能存根“最终”方法,并且因为“getMessage”被声明为final,所以你无法模仿它。


1
投票

我不想使用PowerMock,我解决了创建一个真正的ReloadableResourceBundleMessageSource bean并将其注入我想测试的类的问题

// create the real bean
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(-1);
messageSource.setBasenames("classpath:conf-test/messages"); // this folder is just for testing and it contains a messages_en.properties file

// inject the bean into the class I wanted to test
ReflectionTestUtils.setField(service, "messageSource", messageSource);

0
投票

在这种情况下,我发现了模拟最终方法的模拟限制。

而不是模拟,我在构建它之后设置类,如下所示:

ReloadableResourceBundleMessageSource bundleMessageSource = new ReloadableResourceBundleMessageSource();
bundleMessageSource.setUseCodeAsDefaultMessage(true);

根据official documentation

返回是否使用消息代码作为默认消息而不是抛出NoSuchMessageException。对开发和调试很有用。默认为“false”。

© www.soinside.com 2019 - 2024. All rights reserved.