В моем проекте Spring boot 2.1 у меня разные @Configuration
s для разных тестов (ConfigurationA и ConfigurationB), которые находятся в разных пакетах.Обе конфигурации определяют один и тот же набор bean-компонентов, но по-разному (насмешливо и по-настоящему)
. Как мне известно о механизме Overlay , представленном в Spring Boot 2.1, я имеюустановите свойство: spring.main.allow-bean-definition-overriding=true
.
Однако у меня есть тест с последующей настройкой следующей конфигурации и класса тестирования.Сначала в продуктивной части есть @Configuration
(я использую Maven):
package com.stackoverflow;
@Configuration
public class ProdConfiguration{
...
}
Затем в ветке test есть общий тест @Configuration
на том же уровне пакета:
package com.stackoverflow
@Configuration
public class TestConfiguration {
@Bean
public GameMap gameMap() {
return Mockito.mock(GameMap.class);
}
}
А в подпакете у меня есть еще один @Configuration
:
package com.stackoverflow.impl;
@Configuration
public class RealMapTestConfiguration {
@Bean
public GameMap gameMap() {
return new GameMap("testMap.json");
}
}
И, конечно, меня беспокоит тест:
package com.stackoverflow.impl;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@ContextConfiguration(classes={RealMapTestConfiguration.class, ProdConfiguration.class})
@ActiveProfiles("bug") // spring.main.allow-bean-definition-overriding=true
public class MapImageServiceIT {
@Autowired
private GameMap map;
}
ОказываетсяОказалось, что введенный GameMap
в мой тест является имитирующим экземпляром из TestConfiguration
вместо реального из RealMapTestConfiguration
.В моем тесте у меня была конфигурация ProdConfiguration
и TestConfiguration
, когда я хотел ProdConfiguration
и RealMapTestConfiguration
.Поскольку бины, определенные в ProdConfiguration
и *TestConfiguration
, отличаются, комбинация работает, но TestConfiguration
и RealMapTestConfiguration
определяют то же самое, что и ранее.Кажется, что TestConfiguration
обнаружен компонентным сканированием, поскольку он находится в том же пакете, что и ProdConfiguration
.У меня сложилось впечатление, что при переопределении bean-компонентов предпочтение будет отдаваться определению, которое ближе к тестовому классу.Однако, похоже, что это не так.
Итак, вот мои вопросы:
- При переопределении бобов, каков порядок?Какой бин переопределяет какой?
- Как получить правильный экземпляр в моем тесте (использование другого имени бина не вариант, так как на самом деле внедренный бин не используется непосредственно в тесте, а вслужба, используемая в тесте, и в ней нет спецификатора.)