@SpringBootTest 不加载 application-test.yml 的内容

Nab*_*bor 4 spring-test spring-boot junit5

在这个项目中,我必须使用较旧的 Spring Boot 版本2.2.13.RELEASE

我有一个简单的应用程序-test.yml

myapp:
  foo: test
Run Code Online (Sandbox Code Playgroud)

也是一个非常简单的AppConfig.java

@Component
@ConfigurationProperties(prefix = "myapp")
public class AppConfig {
  private String foo;

  public String getFoo() {
    return foo;
  }

  public void setFoo(final String foo) {
    this.foo = foo;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是测试类:

@SpringBootTest(classes = {AppConfig.class}, properties = "spring.profiles.active:test,local")
class MyTest {
  private final AppConfig properties;

  @Autowired
  IPLocatorServiceTest(final AppConfig properties) {
    this.properties = properties;
  }

  @Test
  void test() {
    assertThat(properties.getFoo()).isEqualTo("test")
  }
}
Run Code Online (Sandbox Code Playgroud)

测试失败。不为空AppConfig,但不会从文件加载值。

我不想加载整个 Spring 应用程序上下文及其所有数据库内容并思考。
我只想加载一些 bean 和配置。

回答

由于下面的答案不是很详细,我想提供完整的解决方案:

@Component
@ConfigurationProperties(FeatureProperties.PREFIX)
public class FeatureProperties {
  public static final String PREFIX = "myapp.feature";
  private String foo;

  public String getFoo() {
    return foo;
  }

  public void setFoo(final String foo) {
    this.foo = foo;
  }
}

@Configuration
@EnableConfigurationProperties(FeatureProperties.class)
public class FeatureConfiguration {
  private final FeatureProperties featureProperties;

  public UsageConfiguration(final FeatureProperties featureProperties) {
    this.featureProperties = featureProperties;
  }
}

@SpringBootTest(classes = {FeatureConfiguration.class}, properties = "spring.profiles.active=test,local")
class FeatureServiceTest {
  // test code in here
}
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力,只加载上下文中真正需要的bean......

Man*_*uel 5

更新:

org.springframework.boot.context.properties.EnableConfigurationProperties您在测试中缺少注释。