在 spring 启动测试中跨线程保留 Mockito 状态时,为什么 @Bean 返回模拟工作但 @MockBean 不起作用?

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?

我有一个 JMS Spring 引导项目,我正在尝试与我的 JMS 侦听器进行集成测试,我使用 mockito 模拟通过外部服务调用来模拟 bean。

在测试期间,我遇到了一个问题,其中 Mockito.when / thenReturn return 在我的 JMS 侦听器中有一个 null

我正在使用 @MockBean 作为相关服务,但是当我使用 @Bean 和 return Mockito.mock 时,我不再获得 null 我的模拟值。

有谁知道为什么这样定义的 @MockBean

之间会有区别
@MockBean
private Service myService;

@Bean定义如下

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

何时涉及到测试 JMS 侦听器?请注意 spring 测试将在 thread[main] 中进行,JMS 侦听器将在 thread[DefaultMessageListenerContainer-1].

中进行侦听

我发现了这个问题。原来SpringMockBean在测试完成后自动重置了。在我的 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;