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

Spring Boot测试时如何不加载完整上下文仅加载单个Bean?

轻量加载所需Bean的三种实现方案

针对不需要加载全量Spring上下文的单元测试场景,可按优先级选择以下方案:

方案1:纯单元测试(不启动Spring上下文,最推荐)

这是执行速度最快的方案,完全不需要依赖Spring容器,直接通过Mock工具注入依赖即可。

  • 测试类添加@ExtendWith(MockitoExtension.class)注解
  • 用@Mock创建Bean B的模拟实例
  • 用@InjectMocks自动将模拟的B注入到类A的实例中
    代码示例:
@ExtendWith(MockitoExtension.class)
public class ATest {
    // 模拟依赖的时钟Bean B
    @Mock
    private Clock clockB;
    // 自动注入依赖的类A实例
    @InjectMocks
    private A targetA;

    @Test
    void testBusinessLogic() {
        // 预设时钟的返回值
        when(clockB.now()).thenReturn(Instant.parse("2024-01-01T00:00:00Z"));
        // 调用类A的业务方法
        // 对返回结果做断言校验
    }
}

方案2:仅加载指定Bean的轻量Spring上下文

如果你的测试确实需要依赖Spring容器的能力,可以通过指定配置类仅加载你需要的两个Bean,避免加载全量上下文。

  • 测试类添加@SpringBootTest注解,通过classes参数指定仅加载自定义测试配置类
  • 测试类内部定义静态@TestConfiguration配置类,仅注册类A和Bean B
    代码示例:
// 仅加载自定义测试配置里的Bean,不会扫描项目全量配置
@SpringBootTest(classes = ATest.CustomTestConfig.class)
public class ATest {
    @TestConfiguration
    static class CustomTestConfig {
        // 注册需要的时钟Bean B,可直接返回测试用固定时间的时钟
        @Bean
        public Clock clockB() {
            return Clock.fixed(Instant.parse("2024-01-01T00:00:00Z"), ZoneId.of("UTC"));
        }
        // 注册待测试的类A
        @Bean
        public A targetA() {
            return new A(clockB());
        }
    }

    @Autowired
    private A targetA;

    @Test
    void testBusinessLogic() {
        // 直接调用类A的方法执行测试即可
    }
}

方案3:替换指定Bean的部分上下文加载

如果测试需要依赖部分Spring自动配置能力,可以通过classes参数指定仅加载类A和Bean B,配合@MockBean按需替换B的实现:

@SpringBootTest(classes = {A.class, Clock.class})
public class ATest {
    // 替换上下文中的时钟Bean B为模拟实例
    @MockBean
    private Clock clockB;
    @Autowired
    private A targetA;

    @Test
    void testBusinessLogic() {
        when(clockB.now()).thenReturn(Instant.parse("2024-01-01T00:00:00Z"));
        // 执行测试逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:15:03