将Spring Boot 2.0.8升级到2.1.2-未能在测试中加载ApplicationContext

将Spring Boot 2.0.8升级到2.1.2-未能在测试中加载ApplicationContext,spring,java-11,Spring,Java 11,将spring从2.0.8升级到2.1.2(使用JDK 8)时,应用程序启动并运行良好,但测试失败,原因是java.lang.IllegalStateException:未能加载ApplicationContext 我使用的是一个抽象类,有些测试确实扩展了它 @SpringBootTest @RunWith(SpringRunner.class) public abstract class AbstractTestkonfiguration { @TestConfiguration s

将spring从2.0.8升级到2.1.2(使用JDK 8)时,应用程序启动并运行良好,但测试失败,原因是
java.lang.IllegalStateException:未能加载ApplicationContext

我使用的是一个抽象类,有些测试确实扩展了它

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

}
类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
这可能与嵌套配置类检测()中的更改有关吗?如果是这样,我如何配置一个仅用于测试的EnvironmentalProperty bean

更新:即使按如下方式使用,也不起作用(结果相同)


你必须做一些改变

  • 您尚未通过
    @EnableConfigurationProperties
  • 属性源需要在测试类中注入
  • 删除
    @组件
    注释
下面是一个工作示例

src/test/resources/my test.properties

my.server.name=foo
my.server=test
my.name=production

src/main/resources/application.properties

my.server.name=foo
my.server=test
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;
    }
}


这适用于Java11和SpringBoot2.1.2.0版本。请注意,这只是一个例子。您必须对其进行适当调整以适应您的项目。

谢谢!这很有效。与本文中的第一个示例相比,我做了以下更改:a)在类级别添加了
@TestPropertySource(value={“classpath:my test.properties”}
@enableConfiguration(AbstractTestKonConfiguration.TestenEnvironmentConfiguration.MyTestProperties.class)
。2) 我在configuration properties类中删除了
@Component
@PropertySource(value=“classpath:my test.properties”)
。但是,它在类
测试环境配置
级别上无法与
@EnableConfigurationProperties
一起工作。很高兴这有帮助。这是正确的
@EnableConfigurationProperties
应该位于
TestEnvironmentConfiguration
。顺便说一句,我提到了测试类上的
@TestPropertySource