Mockito 5.0.0中@MockBean无法替换真实Bean的问题求助
解决Spring Boot 3.1(Mockito 5)下@MockBean注入真实Bean的问题
问题根源
你这情况是因为Spring Boot 3.1集成的Mockito 5,对JUnit扩展和Spring MockBean的初始化逻辑做了严格校验——之前Mockito 4里混用@ExtendWith(MockitoExtension.class)和@MockBean还能正常工作,但Mockito 5里两者的初始化顺序冲突,导致Spring的真实Bean覆盖了MockBean生成的mock对象。
直接解决方案:移除冗余的MockitoExtension注解
@SpringBootTest本身已经通过SpringExtension集成了Mockito的支持,完全能处理@MockBean、@SpyBean这些注解,不需要额外加@ExtendWith(MockitoExtension.class)。修改后的代码如下:
@AutoConfigureMockMvc @SpringBootTest(classes = FakeApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ExceptionHandlerIT { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @MockBean private TestService testService; @Test void testRuntimeException() throws Exception { String errorMsg = "fake error"; when(testService.testMethod()) .thenThrow(new RuntimeException(errorMsg)); // 后续的MockMvc请求断言逻辑 } }
其他可能的排查点
如果移除注解后还是有问题,可以检查这两点:
- 检查
TestService的真实Bean是否标记了@Primary:如果真实Bean是@Primary,Spring会优先注入它,这时候需要给@MockBean也加上@Primary来覆盖。 - 检查是否有自定义的自动配置逻辑:某些条件注解(比如
@ConditionalOnMissingBean)可能导致mock对象被跳过,优先初始化真实Bean。
内容的提问来源于stack exchange,提问作者user6761124
相关产品推荐
相关产品推荐

