在 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;
我有一个 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;