我如何设置不是模拟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(...)
)。是的,它不起作用,所以这是对你问题的直接回答,但正如我上面所解释的,恕我直言,这里的问题更深层次。
我正在开发一个 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 组件。
旁注,如果您不确定单元测试和集成测试之间的区别,请随时阅读
另一方面,当您使用 @MockBean
注释时,Spring 为您的 bean 创建一个 Mock,并把这个 mock 而不是 真正的bean 到应用程序上下文中,以便其他 bean(如果依赖于此消息处理程序)可以获得对此模拟的引用,而不是对真实 bean 的引用。
然后你在 mock (setCache
) 上调用一些方法,实际上它不起作用,因为 mock 不是真实的东西,它是 mock,与 mock 交互的正确方法是指定交互规则(mockito 语法中的样式 when(...).thenReturn(...)
)。是的,它不起作用,所以这是对你问题的直接回答,但正如我上面所解释的,恕我直言,这里的问题更深层次。