У меня есть следующие настройки в проекте Maven.Класс конфигурации для производительного кода:
package com.example;
@Configuration
public class MyConfiguration {
@Bean
public A beanA() {
return new A();
}
...
}
Затем у меня есть один тест, который имеет внутренний Configuration
:
package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, SpringConfigurationTest.MyTestConfiguration.class})
public class SpringConfigurationTest {
@TestConfiguration
static class MyTestConfiguration {
@Bean
@Primary
public A beanA() {
return mock(A.class);
}
}
}
Тесты в этом классе работают нормально.Тогда у меня есть еще один класс Test в подпакете:
package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, AnotherSpringConfigurationTest.MyTestConfiguration.class})
public class AnotherSpringConfigurationTest {
@TestConfiguration
static class MyTestConfiguration {
@Bean
public B beanB() {
return new B()
}
}
}
При запуске тестов в этом классе также включена конфигурация теста из SpringConfigurationTest.MyTestConfiguration
.Я предполагаю, что причиной этого является включение MyConfiguration
, который находится в корневом каталоге.В результате в AnotherSpringConfigurationTest
боб A
подвергается насмешке вместо реального экземпляра.
Как можно избежать того, чтобы классы конфигурации внутри других тестов «просачивались» в другие тесты?
Я видел Профиль Spring-boot по умолчанию для интеграционных тестов , который использует профили Spring в Spring Boot 1.4.1, а я использую Spring Boot 2.0.1.Хотя я уверен, что это можно сделать.
Другой подход, который я мог бы придумать, - это использовать компонентное сканирование, чтобы выбрать контексты и исключить все те, которые мне не нужны, но это немного громоздко, так как я бы предпочел подход, в котором я определяюто, что я хочу использовать вместо того, что не следует использовать.
Существует ли простое и элегантное решение с Spring Boot 2, чтобы избежать конфликтных конфигураций контекста?