Mockito和ReloadableResourceBundleMessageSource合得不好?

时间:2015-12-02 07:46:15

标签: java unit-testing junit mockito

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

我收到了这个错误:

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界面无济于事。

4 个答案:

答案 0 :(得分:2)

正如大卫华莱士所说:

Mockito不能存根"最终"方法,以及' getMessage'被宣告为最终你不能嘲笑它。

答案 1 :(得分:1)

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

<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.IPJ1988.hytexts.ebookstore.activity.HomeActivity">
<item android:icon="@drawable/android_search"
    android:id="@+id/search"
    android:title="Search"
    app:showAsAction="always"
    android:orderInCategory="1"
    app:actionViewClass="android.support.v7.widget.SearchView" />
<item android:id="@+id/action_syn_new"
    android:title="@string/action_syn_new"
    android:onClick="syn_new_ebook"
    android:orderInCategory="2"
    app:showAsAction="never" />

<item android:id="@+id/action_syn"
    android:title="@string/action_syn"
    android:onClick="syn_ebook"
    android:orderInCategory="3"
    app:showAsAction="never"/>

<item android:id="@+id/action_picker"
    android:orderInCategory="4"
    android:title="@string/picker_sesrch"
    android:onClick="picker"
    app:showAsAction="never" />

<item android:id="@+id/action_list"
    android:orderInCategory="5"
    android:title="@string/action_list"
    android:onClick="listGrid_View"
    app:showAsAction="never" />

<item android:id="@+id/action_settings"
    android:orderInCategory="6"
    android:title="@string/action_settings"
    android:onClick="setting"
    app:showAsAction="never" />

<item
    android:orderInCategory="7"
    android:id="@+id/action_download_all"
    android:title="@string/download"
    android:onClick="downloadAll"
    app:showAsAction="never" />

答案 2 :(得分:0)

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

而不是模拟,我在构造它之后设置了类:

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

根据official documentation

  

返回是否将消息代码用作默认消息而不是   抛出NoSuchMessageException。对开发有用   调试。默认为&#34; false&#34;。

答案 3 :(得分:0)

最终方法无法模拟。所以我写了一个这样的解决方案。

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setUseCodeAsDefaultMessage(true);
    ReflectionTestUtils.setField(service, "messageSource", messageSource);