Обновление Spring Boot 2.0.8 до 2.1.2 - не удалось загрузить ApplicationContext в тестах - spring


1

При обновлении Spring с 2.0.8 до 2.1.2 (с использованием JDK 8) приложение запускается и работает нормально, но тесты не выполняются из-за java.lang.IllegalStateException: Failed to load 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 - это класс для свойств безопасной конфигурации (Doc)

До обновления, которое работало, и класс 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

Может ли это быть связано с изменением определения класса вложенной конфигурации (обновление до Spring Framework 5.x)? Если да, то как я могу настроить bean-компонент EnvironmentalProperties только для тестов?

Обновление: даже если используется следующим образом, он не работает (тот же результат).

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

}
Источник
  •  29
  •  1
  • 29 фев 2020 2020-02-29 14:42:15

1 ответ

0

Есть несколько изменений, которые вы должны сделать.

  • Вы не включили свойства конфигурации через @EnableConfigurationProperties
  • Источник свойства должен быть введен в тестовом классе
  • Удалить аннотацию @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. Пожалуйста, обратите внимание, это только пример. Вы должны будете адаптировать его к своему проекту должным образом.