Spring Boot: @TestConfiguration не переопределяет компонент во время интеграционного теста - PullRequest
0 голосов
/ 30 мая 2018

У меня есть Bean, определенный в классе, украшенном @Configuration:

@Configuration
public class MyBeanConfig {

    @Bean
    public String configPath() {
        return "../production/environment/path";
    }
}

У меня есть класс, украшенный @TestConfiguration, который должен переопределить это Bean:

@TestConfiguration
public class MyTestConfiguration {

    @Bean
    @Primary
    public String configPath() {
        return "/test/environment/path";
    }
}

Компонент configPath используется для установки пути к внешнему файлу, содержащему регистрационный код, который должен быть прочитан во время запуска.Он используется в классе @Component:

@Component
public class MyParsingComponent {

    private String CONFIG_PATH;

    @Autowired
    public void setCONFIG_PATH(String configPath) {
        this.CONFIG_PATH = configPath;
    }
}

При попытке отладки я установил точку останова внутри каждого метода, а также конструктор класса конфигурации теста.Достигнута точка останова конструктора @TestConfiguration, поэтому я знаю, что мой класс конфигурации теста создается, но метод configPath() этого класса никогда не срабатывает.Вместо этого вызывается метод configPath() обычного класса @Configuration, и @Autowired String в MyParsingComponent всегда ../production/environment/path, а не ожидаемый /test/environment/path.

Не уверен, почему этоэто происходит.Любые мысли будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Убедитесь, что имя метода вашего фабричного метода @Bean не соответствует ни одному из существующих имен bean-компонентов.У меня были проблемы с именами методов, такими как config () или (в моем случае) prometheusConfig () , которые конфликтовали с существующими именами бинов.Spring пропускает эти фабричные методы молча и просто не вызывает их / не создает экземпляры bean-компонентов.

Если вы хотите переопределить определение bean-компонента в своем тесте, явно используйте имя bean-компонента в качестве строкипараметр в аннотации @Bean ("beanName").

0 голосов
/ 01 июня 2018

Как описано в разделе Определение конфигурации теста справочного руководства Spring Boot, все компоненты, настроенные в классе верхнего уровня, помеченном @TestConfiguration, будут не извлечены через компонентсканирования.Таким образом, вы должны явно зарегистрировать свой @TestConfiguration класс.

Вы можете сделать это либо через @Import(MyTestConfiguration.class), либо @ContextConfiguration(classes = MyTestConfiguration.class) в своем тестовом классе.

С другой стороны, если ваш классс пометкой @TestConfiguration, если * вложенный класс *1015* в пределах вашего тестового класса, он будет зарегистрирован автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...