【问题标题】:Why does @Bean returning a mock work but @MockBean doesn't work when it comes to preserving Mockito state across threads in a spring boot test?为什么@Bean 返回一个模拟工作但@MockBean 在春季启动测试中跨线程保留 Mockito 状态时不起作用?
【发布时间】:2021-06-17 02:07:44
【问题描述】:

我有一个 JMS Spring Boot 项目,我正在尝试使用我的 JMS 侦听器进行集成测试,并且我使用 mockito 模拟来模拟带有外部服务调用的 bean。

在测试期间,我遇到了Mockito.when / thenReturn 在我的 JMS 侦听器中返回 null 的问题。

我使用@MockBean 处理有问题的服务,但是当我使用@Bean 并返回Mockito.mock 时,我的模拟中不再获得null 值。

有谁知道为什么@MockBean 这样定义会有区别

@MockBean
private Service myService;

@Bean 这样定义

@Bean
private Service myService(){
   return Mockito.mock(Service.class);
}

在测试 JMS 侦听器时?请注意,春季测试将在thread[main],JMS 侦听器将在thread[DefaultMessageListenerContainer-1] 侦听。

【问题讨论】:

    标签: spring-boot junit mockito spring-test


    【解决方案1】:

    我发现了这个问题。事实证明,Spring MockBean 在测试完成后会自动重置。对于我的 JMS 侦听器,事实证明带有测试的主线程已经完成并且模拟已经重置。对于看到相同行为的其他人,请确认您的主测试线程尚未完成。

    这是我在MockBean.java看到的代码

    /**
         * The reset mode to apply to the mock bean. The default is {@link MockReset#AFTER}
         * meaning that mocks are automatically reset after each test method is invoked.
         * @return the reset mode
         */
        MockReset reset() default MockReset.AFTER;
    

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多