使用@TestConfiguration定义Mock后,其他单元测试Mock覆写失效求助
问题解决:Spring Boot测试中Mock Bean行为覆盖不生效
问题原因
你在全局TestConfig中定义了带@Primary的UserService Mock Bean,并且用doReturn(12L)固定了返回值。后续测试中用when(userService.getCompanyId()).thenReturn(155L)不生效,核心原因有两点:
- Mockito中
doReturn的设置优先级高于when(...).thenReturn,原有固定行为不会被后者覆盖 - 全局
@PrimaryBean会被Spring容器优先加载,导致测试类中无法直接替换其行为
解决方案
方案1:用doReturn覆盖原有Mock行为
如果必须保留全局的TestConfig,在需要修改返回值的测试类中,直接用doReturn覆盖原有设置(和原配置用相同的Mock操作方式):
// 注入容器中的UserService Mock @Autowired private UserService userService; @BeforeEach void setUp() { // 用doReturn覆盖原有返回值 doReturn(155L).when(userService).getCompanyId(); }
方案2:用@MockBean替换全局Mock Bean
更可靠的方式是在目标测试类中用@MockBean重新定义UserService,完全替换掉全局的@Primary Mock Bean,这样你可以完全控制Mock行为:
@SpringBootTest public class TargetTestClass { // @MockBean会替换Spring容器中已有的UserService Bean @MockBean private UserService userService; @BeforeEach void initMock() { // 自由设置返回值 when(userService.getCompanyId()).thenReturn(155L); // 也可以用doReturn // doReturn(155L).when(userService).getCompanyId(); } @Test void testSomething() { // 测试逻辑,此时userService.getCompanyId()返回155L } }
方案3:限制全局TestConfig的生效范围
避免让TestConfig全局生效,只在需要返回12L的测试类中导入该配置:
// 仅在需要12L返回值的测试类中导入TestConfig @SpringBootTest @Import(TestConfig.class) public class OriginalTestClass { // 测试逻辑 } // 其他测试类不导入TestConfig,直接用@MockBean定义自己的Mock @SpringBootTest public class OtherTestClass { @MockBean private UserService userService; @BeforeEach void setUp() { when(userService.getCompanyId()).thenReturn(155L); } }
内容的提问来源于stack exchange,提问作者RAHUL VISHWAKARMA
相关产品推荐
相关产品推荐

