You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot @MockBeans 如何在多个测试类中复用相同的模拟Bean

问题根因

你之前单独用@ContextConfiguration引入配置类时,会直接替换@WebMvcTest默认的Web层上下文加载规则,导致你指定的Controller、安全配置类没有被加载到Spring上下文,所以接口访问会返回404。

可选实现方案

方案1:自定义组合注解(更推荐,代码复用度更高)

把所有公共的测试注解打包成一个自定义注解,不会改动原有上下文加载逻辑,完全不会出现404问题:

  1. 先定义自定义注解
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 {
}
  1. 测试类直接引用即可
@WebMvcTest(value = [ScriptController, SecurityConfiguration, ScriptPermissionEvaluator])
@CommonSecurityTest
class ScriptControllerSecurityTest extends Specification {
    // 测试逻辑不变
}

所有其他安全测试类都可以复用这个@CommonSecurityTest注解,不需要重复写Mock相关配置。


方案2:保留配置类的实现方式

如果一定要用独立配置类,不要用@ContextConfiguration引入,直接把配置类加到@WebMvcTest的类加载列表里即可:

  1. 配置类保持你写的逻辑不变
@Configuration
@MockBeans([@MockBean(ObjectRepository), @MockBean(ChannelRepository), 
@MockBean(ChannelSubscriberRepository)])
class MockRepositoryConfiguration
{}
  1. 测试类写法调整
@WebMvcTest(value = [ScriptController, SecurityConfiguration, ScriptPermissionEvaluator, MockRepositoryConfiguration])
@ExtendWith(SpringExtension)
@ActiveProfiles("test")
class ScriptControllerSecurityTest extends Specification {
    // 测试逻辑不变
}

内容的提问来源于stack exchange,提问作者Droem19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:24:04