@SpringBootTest 没有加载应用的内容-test.yml

@SpringBootTest does not load content of application-test.yml

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

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

myapp:
  foo: test

也很简单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;
  }
}

这是测试class:

@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")
  }
}

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

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

回答

因为下面的回答不是很详细我想提供完整的解决方案:

@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
}

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

更新:

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

您可以尝试将 application-test.yml 重命名为 application.yml。此文件应在 test/resources 中。 那么你应该能够避免在@SpringBootTest 中定义属性部分。 直接写 @SpringBootTest