我如何设置不是模拟bean的bean的字段

How can I set field that is not a bean for a mockbean

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

当使用 Spring-boot-test 测试 MessageHandler class 时,我使用 @Mockbean 模拟 MessageHandler 并尝试使用 setter 为模拟豆。但是当我 运行 测试 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 的字段。

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

您在集成测试中测试 MessageHandler class(否则,如果它是单元测试 - 那么 spring 不需要启动测试)

所以目标是检查您在 MessageHandler 中编写的代码是否真的有效,并且由于它是一个集成测试,可能会强调与其他人的交互real/semi-real 组件。

旁注,如果您不确定单元测试和集成测试之间的区别,请随时阅读 或 google,它将提供更多有价值的资源当然,关键是你应该清楚地了解两者之间的区别,并为工作选择合适的工具。

另一方面,当您使用 @MockBean 注释时,Spring 为您的 bean 创建一个 Mock,并把这个 mock 而不是 真正的bean 到应用程序上下文中,以便其他 bean(如果依赖于此消息处理程序)可以获得对此模拟的引用,而不是对真实 bean 的引用。

然后你在 mock (setCache) 上调用一些方法,实际上它不起作用,因为 mock 不是真实的东西,它是 mock,与 mock 交互的正确方法是指定交互规则(mockito 语法中的样式 when(...).thenReturn(...))。是的,它不起作用,所以这是对你问题的直接回答,但正如我上面所解释的,恕我直言,这里的问题更深层次。