Использование @Primary с spring-context-indexer - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь добавить spring-context-indexer в библиотеки моего проекта. Однако при запуске интеграционного теста я бы не хотел использовать Бин из зависимости (SystemConfiguration), а переопределить его с помощью @Primary, чтобы вернуть new MockSystemConfiguration(). Это не похоже на работу с индексатором контекста пружины.

Вот мой тест

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = CustomTestSpringConfig.class)
class SpringDataConfigurationTest {

    @Test
    void applicationContextCanStart() {
        assertTrue(true);
    }
}

И CustomTestSpringconfig

@Configuration
@ComponentScan(basePackageClasses = SystemConfiguration.class)
public class CustomTestSpringConfig {
    @Primary
    @Bean(name = "SystemConfiguration")
    public SystemConfiguration systemConfiguration() {
        return new MockSystemConfiguration();
    }
}

Реальное SystemConfiguration определено в другом банке, в котором уже есть spring-component-indexer.

@Component("SystemConfiguration")
public class SystemConfigurationImpl implements SystemConfiguration {

То, что происходит, - это реальный SystemConfiguration Бин, используемый вместо аннотированного @Primary.

1 Ответ

1 голос
/ 02 июля 2019

Если это зависимость вашего проекта (и вы импортируете эту зависимость в свое приложение, но у вас есть контроль над зависимостью), имеет смысл объявить бин с условиями.Например:

@Bean
@ConditionalOnMissingBean(SystemConfiguration.class) // mock bean in tests would be of the the same type so this one is skipped
SystemConfiguration systemConfiguration() {
    return new SystemConfigurationImpl();
}

Если у вас нет контроля над зависимостями и вам нужен тестовый компонент, естественно запускать тесты с профилем test, поэтому вы можете играть с @Profile("test") и @ActiveProfiles("test").

Хорошие примеры здесь: Пружинные профили

...