将 Spring Boot 2.0.8 升级到 2.1.2 - 无法在测试中加载 ApplicationContext
Upgrade Spring Boot 2.0.8 to 2.1.2 - Failed to load ApplicationContext in tests
将 spring 从 2.0.8 升级到 2.1.2(使用 JDK 8)时,应用程序启动并运行正常,但由于 java.lang.IllegalStateException: Failed to load ApplicationContext
.[=17=,测试失败]
我正在使用一些测试确实扩展的抽象 class。
@SpringBootTest
@RunWith(SpringRunner.class)
public abstract class AbstractTestkonfiguration {
@TestConfiguration
static class TestEnvironmentConfiguration {
@Component
@PropertySource(value = "classpath:my-test.properties")
@ConfigurationProperties(prefix = "my")
public static class MyTestProperties extends EnvironmentalProperties {
}
}
}
class EnvironmentalProperties 是 class 类型安全配置属性 (Doc)
在升级之前有效并提供了 class EnvironmentalProperties,但现在我得到了
[...]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.abc.EnvironmentalProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1651)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1210)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 90 more
是否与嵌套配置 Class 检测 (Upgrading to Spring Framework 5.x) 的更改有关?如果是这样,我如何配置仅用于测试的 EnvironmentalProperties bean?
更新:即使按如下方式使用它也不起作用(结果相同)。
@SpringBootTest
@RunWith(SpringRunner.class)
public abstract class AbstractTestkonfiguration {
@Configuration
public static class TestEnvironmentConfiguration {
@Bean
public MyTestProperties environmentalProperties(){
return new EnvironmentalProperties() {
// manual creation of an instance
}
}
}
}
您必须进行一些更改。
- 您还没有通过
@EnableConfigurationProperties
启用配置属性
- 需要在测试时注入属性源class
- 删除
@Component
注释
这是一个工作示例;
src/test/resources/my-test.properties
my.server.name=foo
my.server=test
和
src/main/resources/application.properties
my.name=production
生产配置。
@ConfigurationProperties(prefix = "my")
@PropertySource(value = "classpath:application.properties")
public class EnvironmentalProperties {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
@SpringBootTest
@TestPropertySource(value = {"classpath:my-test.properties", "classpath:application.properties"})
@RunWith(SpringRunner.class)
public class AbstractTestkonfiguration {
@Autowired
private MyTestProperties myTestProperties;
@TestConfiguration
@EnableConfigurationProperties(MyTestProperties.class)
public static class TestEnvironmentConfiguration {
@ConfigurationProperties(prefix = "my")
public static class MyTestProperties extends EnvironmentalProperties {
private String server;
public String getServer() {
return server;
}
public void setServer(final String server) {
this.server = server;
}
}
}
@Test
public void check_configuration () {
Assert.assertEquals(myTestProperties.getServer(), "test");
Assert.assertEquals(myTestProperties.getName(), "production");
}
这适用于 Java 11 & spring-boot 2.1.2.RELEASE。请注意,这只是一个示例。您必须根据您的项目适当调整它。
将 spring 从 2.0.8 升级到 2.1.2(使用 JDK 8)时,应用程序启动并运行正常,但由于 java.lang.IllegalStateException: Failed to load ApplicationContext
.[=17=,测试失败]
我正在使用一些测试确实扩展的抽象 class。
@SpringBootTest
@RunWith(SpringRunner.class)
public abstract class AbstractTestkonfiguration {
@TestConfiguration
static class TestEnvironmentConfiguration {
@Component
@PropertySource(value = "classpath:my-test.properties")
@ConfigurationProperties(prefix = "my")
public static class MyTestProperties extends EnvironmentalProperties {
}
}
}
class EnvironmentalProperties 是 class 类型安全配置属性 (Doc)
在升级之前有效并提供了 class EnvironmentalProperties,但现在我得到了
[...]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.abc.EnvironmentalProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1651)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1210)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 90 more
是否与嵌套配置 Class 检测 (Upgrading to Spring Framework 5.x) 的更改有关?如果是这样,我如何配置仅用于测试的 EnvironmentalProperties bean?
更新:即使按如下方式使用它也不起作用(结果相同)。
@SpringBootTest
@RunWith(SpringRunner.class)
public abstract class AbstractTestkonfiguration {
@Configuration
public static class TestEnvironmentConfiguration {
@Bean
public MyTestProperties environmentalProperties(){
return new EnvironmentalProperties() {
// manual creation of an instance
}
}
}
}
您必须进行一些更改。
- 您还没有通过
@EnableConfigurationProperties
启用配置属性
- 需要在测试时注入属性源class
- 删除
@Component
注释
这是一个工作示例;
src/test/resources/my-test.properties
my.server.name=foo
my.server=test
和
src/main/resources/application.properties
my.name=production
生产配置。
@ConfigurationProperties(prefix = "my")
@PropertySource(value = "classpath:application.properties")
public class EnvironmentalProperties {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
@SpringBootTest
@TestPropertySource(value = {"classpath:my-test.properties", "classpath:application.properties"})
@RunWith(SpringRunner.class)
public class AbstractTestkonfiguration {
@Autowired
private MyTestProperties myTestProperties;
@TestConfiguration
@EnableConfigurationProperties(MyTestProperties.class)
public static class TestEnvironmentConfiguration {
@ConfigurationProperties(prefix = "my")
public static class MyTestProperties extends EnvironmentalProperties {
private String server;
public String getServer() {
return server;
}
public void setServer(final String server) {
this.server = server;
}
}
}
@Test
public void check_configuration () {
Assert.assertEquals(myTestProperties.getServer(), "test");
Assert.assertEquals(myTestProperties.getName(), "production");
}
这适用于 Java 11 & spring-boot 2.1.2.RELEASE。请注意,这只是一个示例。您必须根据您的项目适当调整它。