2015-12-02 72 views
2

我有這個簡單的測試,它甚至不是一個測試,因爲我只是試圖模擬消息源。Mockito和ReloadableResourceBundleMessageSource不能很好地結合在一起?

我得到這個錯誤:

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

我不知道你的問題是什麼,但爲什麼getMessage是不可能存在的,因爲它是'AbstractMessageSource'中聲明的'final',它是'ReloadableResourceBundleMessageSource'的超類。 Mockito不能殘缺最終的方法。 –

+0

謝謝,這解釋了它! – OddBeck

回答

2

正如大衛·華萊士說:

的Mockito不能存根「最後」的方法,並作爲「的getMessage」聲明最後你不能嘲笑它。

+0

你的回答基本上是@DavidWallace評論的一種剽竊。你可能已經擴展提一下PowerMock你的答案是能[模擬最終方法(https://code.google.com/p/powermock/wiki/MockFinal) –

+1

,它是我的意見的副本不事實讓它錯誤。 OddBeck通過發佈這個做了正確的事情,而我太懶惰了。他/她甚至把它歸功於它。這不值得讚賞。 –

+0

謝謝David W! @RomanVottner: 我不知道PowerMock的,如果我已經意識到與和的Mockito最終方法問題的我很可能不會在所有問到這個問題。 – OddBeck

1

我不想使用PowerMock,我解決了建立一個真正的ReloadableResourceBundleMessageSource豆的問題,它注入類我想測試

// 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

我發現了一個變通的限制的Mockito到嘲笑這種情況下的最終方法。

而是嘲諷,我設置類構造像這樣經過:

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

按照official documentation

Return whether to use the message code as default message instead of throwing a NoSuchMessageException. Useful for development and debugging. Default is "false".