Spring Boot: @TestConfiguration Не перегружающий компонент во время тестирования интеграции

У меня есть 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 точка останова конструктора @TestConfiguration, поэтому я знаю, что мой тестовый класс конфигурации configPath(), однако метод configPath() этого класса никогда не попадает. Вместо этого используется метод configPath() класса normal @Configuration и @Autowired String в MyParsingComponent всегда ../production/environment/path а не ожидаемый /test/environment/path.

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

Ответ 1

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

Вы можете сделать это с помощью @Import(MyTestConfiguration.class) или @ContextConfiguration(classes = MyTestConfiguration.class) в вашем тестовом классе.

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

Ответ 2

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

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