将 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。请注意,这只是一个示例。您必须根据您的项目适当调整它。