我需要测试使用@ConfigurationProperties bean的自动配置类。我正在使用中记录的ApplicationContextRunnerhttps://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-具有测试自动配置功能,可以加快测试速度,避免在每个变体之间启动servlet容器。但是,使用@AutoconfigurationProperties注释的bean不会使用注入ApplicationContextRunner的值填充。
我怀疑我遇到了类似https://stackoverflow.com/a/56023100/1484823问题
@ConfigurationProperties不由您在测试中构建的应用程序上下文管理,尽管它们将在应用程序启动时加载,因为您的应用程序主类上有@EnableConfigurationProperties。
如何使用ApplicationContextRunner启用对@ConfigurationProperties的支持?
这里是相应的代码
@Test
void ServiceDefinitionMapperPropertiesAreProperlyLoaded() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
SingleServiceDefinitionAnswerAutoConfig.class,
DynamicCatalogServiceAutoConfiguration.class
))
// .withPropertyValues(DynamicCatalogProperties.OPT_IN_PROPERTY + "=true") //Not sure why this seems ignored
.withSystemProperties(DynamicCatalogConstants.OPT_IN_PROPERTY + "=true",
ServiceDefinitionMapperProperties.PROPERTY_PREFIX
+ServiceDefinitionMapperProperties.SUFFIX_PROPERTY_KEY+ "=suffix")
;
contextRunner.run(context -> {
assertThat(context).hasSingleBean(ServiceDefinitionMapperProperties.class);
ServiceDefinitionMapperProperties serviceDefinitionMapperProperties
= context.getBean(ServiceDefinitionMapperProperties.class);
assertThat(serviceDefinitionMapperProperties.getSuffix()).isEqualTo("suffix");
});
}
它失败于:
org.opentest4j.AssertionFailedError:
Expecting:
<"">
to be equal to:
<"suffix">
but was not.
Expected :suffix
Actual :
<Click to see difference>
at org.springframework.cloud.appbroker.autoconfigure.DynamicCatalogServiceAutoConfigurationTest
public class DynamicCatalogServiceAutoConfiguration {
[...]
@Bean
@ConfigurationProperties(prefix=ServiceDefinitionMapperProperties.PROPERTY_PREFIX, ignoreUnknownFields = false)
public ServiceDefinitionMapperProperties serviceDefinitionMapperProperties() {
return new ServiceDefinitionMapperProperties();
}
[...]
}
完整资料来源可于https://github.com/orange-cloudfoundry/osb-cmdb-spike/blob/0da641e5f2f811f48b0676a25c8cbe97895168d1/spring-cloud-app-broker-autoconfigure/src/test/java/org/springframework/cloud/appbroker/autoconfigure/DynamicCatalogServiceAutoConfigurationTest.java#L89-L107
附言:我正要把一个问题提交给https://github.com/spring-projects/spring-boot/issues 建议文档增强,以警告ApplicationContext中的此类限制,并询问如何启用对@ConfigurationProperties的支持。遵循以下指南:https://raw.githubusercontent.com/spring-projects/spring-boot/master/.github/ISSUE_TEMPLATE.md,我首先要确保我没有误解这个问题。
如果您想在测试中填充一个注释为@ConfigurationProperties
类的bean,并且您通常依赖于注释为@EnableConfigurationProperties
的配置类来填充该bean,那么您可以创建一个简单的配置类测试:
@ConfigurationProperties("app")
public class ConfigProps {
private int meaningOfLife;
public int getMeaningOfLife() { return meaningOfLife; }
public void setMeaningOfLife(int meaning) { this.meaningOfLife = meaning; }
}
class ConfigPropsTest {
private final ApplicationContextRunner runner = new ApplicationContextRunner();
@EnableConfigurationProperties(ConfigProps.class)
static class TrivialConfiguration {
}
@Test
void test() {
runner.withUserConfiguration(TrivialConfiguration.class)
.withPropertyValues("app.meaning-of-life=42")
.run(context -> {
assertEquals(42, context.getBean(ConfigProps.class).getMeaningOfLife());
});
}
}
将configuration
传递给ApplicationContextRunner
足以使其创建ConfigProps
并使用可用属性填充它。
我试图为一个Spring引导项目写一个集成测试。不幸的是,我对实现感到困惑。 下面是已尝试的示例代码段 问题 我是否需要一个单独的,带有注释以支持集成测试
我正在测试我的spring boot应用程序。我正在做集成测试,但由于url返回的响应无法jsonfied,测试一直失败。请帮忙。以下是测试功能: 错误:
我无法使用maven运行spring boot应用程序的测试。我看过很多关于这个的帖子,他们的大多数解决方案是: 将junit版本与maven surefire插件或 确保junit版本不是由预定义的 我的项目不使用父级,也不使用专家-sure-fire插件。否则,根据pom文件,我没有看到任何明显的冲突。我确实看到了 ,但这是向后兼容性的纯复古依赖性的一部分。 是什么导致了这种情况? 砰的一声
从2.0.6开始使用spring boot starter test会带来JUnit 4依赖性。如何使用spring boot starter test(通过Gradle),但使用JUnit 5,而不引入JUnit 4依赖项? 如果有帮助,这是Gradle的部分依赖输出: 这是我的身材。gradle文件: 添加JUnit 5依赖项并执行注释中提到的排除就完成了。测试依赖项现在如下所示:
我有一个Spring Boot集成测试,其类定义如下。 我得到以下例外: 我的TestApplication类定义如下: properties-context.xml定义如下: 这从一个名为external.properties.的文件中读取,在我的外部属性文件中设置了属性'spring.main.allow-Bean-定义-覆盖=true'。我添加此项是因为当我运行应用程序时,出现了相同的异常,