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").