@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
在这个项目中,我必须使用较旧的 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