Spring Boot @MockBeans 如何在多个测试类中复用相同的模拟Bean
问题根因
你之前单独用@ContextConfiguration引入配置类时,会直接替换@WebMvcTest默认的Web层上下文加载规则,导致你指定的Controller、安全配置类没有被加载到Spring上下文,所以接口访问会返回404。
可选实现方案
方案1:自定义组合注解(更推荐,代码复用度更高)
把所有公共的测试注解打包成一个自定义注解,不会改动原有上下文加载逻辑,完全不会出现404问题:
- 先定义自定义注解
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBeans; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(SpringExtension.class) @ActiveProfiles("test") @MockBeans({ @MockBean(ObjectRepository.class), @MockBean(ChannelRepository.class), @MockBean(ChannelSubscriberRepository.class) }) public @interface CommonSecurityTest { }
- 测试类直接引用即可
@WebMvcTest(value = [ScriptController, SecurityConfiguration, ScriptPermissionEvaluator]) @CommonSecurityTest class ScriptControllerSecurityTest extends Specification { // 测试逻辑不变 }
所有其他安全测试类都可以复用这个@CommonSecurityTest注解,不需要重复写Mock相关配置。
方案2:保留配置类的实现方式
如果一定要用独立配置类,不要用@ContextConfiguration引入,直接把配置类加到@WebMvcTest的类加载列表里即可:
- 配置类保持你写的逻辑不变
@Configuration @MockBeans([@MockBean(ObjectRepository), @MockBean(ChannelRepository), @MockBean(ChannelSubscriberRepository)]) class MockRepositoryConfiguration {}
- 测试类写法调整
@WebMvcTest(value = [ScriptController, SecurityConfiguration, ScriptPermissionEvaluator, MockRepositoryConfiguration]) @ExtendWith(SpringExtension) @ActiveProfiles("test") class ScriptControllerSecurityTest extends Specification { // 测试逻辑不变 }
内容的提问来源于stack exchange,提问作者Droem19
相关产品推荐
相关产品推荐

