【问题标题】:How can I set field that is not a bean for a mockbean如何为 mockbean 设置不是 bean 的字段
【发布时间】:2019-08-06 03:29:44
【问题描述】:

我正在开发一个 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 的字段。

【问题讨论】:

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


    【解决方案1】:

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

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

    因此,我们的目标是检查您在 MessageHandler 中编写的代码是否真的有效,因为它是一个集成测试,可能重点是与其他真实/半真实组件的交互。

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

    另一方面,当您使用@MockBean 注解时,Spring 会为您的 bean 创建一个 Mock,并将这个 mock 而不是真正的 bean 放入应用程序上下文中,以便其他 bean,如果依赖于这个消息处理程序,可以获得这个 mock 上的引用而不是真实 bean 上的引用。

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

    【讨论】:

    • 好的,谢谢,确实 setCache() 不会像我在 MessageHandler 中写的那样,因为它是模拟的。但是我不明白的是,MessageHandler是一个组件,如果我不使用spring boot@MockBean,我该如何测试呢?
    • 首先,决定what_exactly_you_want_to_test,然后决定是用单元测试还是集成测试。如果单元 -> 根本不使用弹簧靴。只需使用普通的模仿。通常您可能需要重构代码以使其可测试。默认情况下,并非每个类都是可测试的。您可以发布带有源代码的问题并检查如何准确地对其进行测试...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2021-05-01
    • 2011-11-26
    • 1970-01-01
    • 2020-02-28
    • 2016-07-04
    • 2014-08-18
    相关资源
    最近更新 更多