如何设置非bean的bean字段

时间:2019-08-06 03:29:44

标签: java spring-boot mockito spring-boot-test

我正在开发一个MessageHandler类,其中包含我也开发的Cache字段,MessageHandler注释为@Component,而Cache不是bean。

当使用Spring-boot-test测试MessageHandler类时,我使用@Mockbean模拟MessageHandler并尝试使用setter为模拟bean设置Cache对象。但是,当我运行测试以查看MessageHandler是否具有缓存时,我得到了null。

我的代码如下:


@MockBean(value = HiMessageHandler.class)
MessageHandler messageHandler;

public void setUp(){
       Cache cache=new Cache();
       cache.offer(new HiMessage("1","1","1"));
       messageHandler.setCache(cache);
  }


@Test
public void testConsume() throws Exception {
    setUp();
    System.out.println(messageHandler.getCache());
}

我想知道如何为模拟bean设置一个非bean的字段。

1 个答案:

答案 0 :(得分:0)

我认为这里的主要问题是您尝试模拟要测试的类。

您要在集成测试中测试MessageHandler类(否则,如果它是单元测试-则不需要spring boot测试)

因此,目标是检查您在MessageHandler中编写的代码是否确实有效,并且由于它是集成测试,因此可能着重于与其他真实/半真实组件的交互。 / p>

请注意,如果您不确定单元测试和集成测试之间的区别,请随时阅读my answer on this question或仅阅读google,它肯定会提供更多有价值的资源,重点是您应该清楚地了解两者之间的区别,并为工作选择合适的工具。

另一方面,当您使用@MockBean批注时,Spring为您的bean创建一个Mock,并将此模拟代替放入真实的bean到应用程序上下文中,以便其他bean ,如果依赖于此消息处理程序,则可以获取该模拟的引用,而不是真实bean的引用。

然后您在模拟(setCache)上调用某些方法,但实际上它不起作用,因为模拟不是真实的事物,它是模拟,与模拟交互的正确方法是指定交互规则(mockito语法中的样式when(...).thenReturn(...))。是的,它不起作用,所以这是您问题的直接答案,但是正如我在上文中所解释的,在这里恕我直言。