2015-12-02 69 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".