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

JUnit5测试Spring LDAP共享库时Spring上下文启动问题

核心原因说明

你遇到的依赖行为差异,本质就是依赖传递规则和@SpringBootTest的设计要求没对上,和actuator本身的功能没有关系:

  • @SpringBootTest是Spring Boot专属的测试注解,启动Spring上下文的逻辑强依赖Spring Boot核心模块(spring-boot-starter及其传递引入的spring-boot-autoconfigure等组件),这些组件负责提供测试上下文引导、属性占位符解析(也就是你说的@Value注解支持)、配置类扫描等基础能力。
  • spring-boot-starter-test本身不会传递引入Spring Boot应用启动所需的核心spring-boot-starter依赖,它只包含测试工具、Mock组件、测试自动配置相关的包。
  • 当你把spring-boot-starter-actuator声明为implementation依赖时,actuator本身会传递引入spring-boot-starter核心依赖,相当于生产类路径下凑齐了@SpringBootTest启动需要的所有组件,因此测试可以正常运行。你误以为是actuator提供了@Value解析能力,实际是它传递拉入的Spring Boot核心starter提供的,actuator本身只是监控端点组件,和上下文基础能力无关。
  • 当你把spring-boot-starter-actuator声明为testImplementation依赖时,哪怕测试类路径下存在actuator传递的核心starter,你的共享库项目本身没有带@SpringBootApplication注解的启动入口类,@SpringBootTest默认的包扫描逻辑找不到启动类,就不会正确触发自动配置加载流程,也不会识别你写的内部静态配置类,最终导致容器中没有对应Bean,@Autowired注入为null。
符合需求的正确配置方案

完全不需要把任何Spring Boot相关依赖放到生产implementation配置中,只需要做两处调整即可:

  1. 依赖配置调整,生产侧只保留原生Spring和LDAP SDK,Spring Boot相关依赖全部放到测试范围:
dependencies {
  implementation 'com.unboundid:unboundid-ldapsdk'
  implementation 'org.springframework:spring-context'

  testImplementation 'org.junit.jupiter:junit-jupiter'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  // 仅测试范围引入Spring Boot核心starter,提供@SpringBootTest运行所需的基础依赖
  testImplementation 'org.springframework.boot:spring-boot-starter'
}
  1. 测试类调整,显式指定上下文加载用的配置类,避免扫描不到启动类的问题,同时修正原代码里的拼写错误:
// 显式指定加载内部的测试配置类,不需要找@SpringBootApplication入口
@SpringBootTest(classes = MyLdapLibTest.SpringTestConfiguration.class)
public class MyLdapLibTest {

  @Autowired
  private MyLdapLib myLib;

  @Tag("integrationTest")
  @Test
  public void test1() throws Exception { // 修正原代码里thorws的拼写错误
    String val = myLib.getSomething("my value");
    // 编写断言逻辑
  }

  @Configuration
  // 如果需要读取测试配置文件,加下面的注解指定配置路径
  // @PropertySource("classpath:application-test.properties")
  public static class SpringTestConfiguration {
    @Bean
    MyLdapLib createMyLib() {
      return new MyLdapLib();
    }
  }
}

这种配置下,最终打包的生产Jar只会包含原生Spring和LDAP SDK依赖,所有Spring Boot相关组件仅在测试编译、运行阶段存在,完全满足你不引入生产额外依赖的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:48:19