Есть ли противоречивое поведение при вызове AnnotationConfigApplicationContext.register (Class ...)? - PullRequest
0 голосов
/ 24 января 2020

Я испытываю непоследовательное поведение в тесте JUnit 5, связанном с регистрацией bean-компонентов. При локальном запуске теста все проходит, как и ожидалось, но при запуске теста в нашем конвейере Jenkins порядок загрузки кажется другим. @ConditionalOnMissingBean не разрешается должным образом, и тест получает два определения для одного и того же компонента.

Регистрация компонента в самом тесте выглядит следующим образом:

private AnnotationConfigApplicationContext context;

@BeforeEach
public void setUpTest() {
    this.context = new AnnotationConfigApplicationContext();
}

@AfterEach
public void tearDownTest() {
    if (this.context != null) {
        this.context.close();
    }
}

@Test
public void testRegisterCustomPropertiesCorrectly() throws Exception {
    register(CustomProperties.class, ServiceConfig.class);

    ...
}

private void register(Class<?>... components) {
    this.context.register(components);
    this.context.refresh();
}

CustomProperties

@Configuration
public static class CustomProperties {

    @Bean
    public ShutdownProperties shutdownProperties() {
        ...
    }

    @Bean
    public ServiceProperties serviceProperties() {
        ...
    }

    @Bean
    public TomcatCustomProperties tomcatCustomProperties() {
        ...
    }

    @Bean
    public ThreadPoolProperties threadPoolProperties() {
        ...
    }
}

ServiceConfig

@Configuration
@Import(ThreadPoolConfig.class)
public class ServiceConfig {

}

ThreadPoolConfig

@Component
@ConfigurationProperties(prefix = "service.thread-pool")
@ConditionalOnMissingBean(ThreadPoolProperties.class)
public class ThreadPoolProperties {
    ...
}

Есть ли что-нибудь, что я не видать или что я могу делать не так? Или есть поведение в способе AnnotationConfigApplicationContext регистрации, обновления или закрытия, о котором я не знаю? Я не мог найти какую-либо точку, где неопределенность будет введена. Это происходит последовательно, так что должно быть даже так. Если это важно, моя локальная машина - Ma c, но машины Jenkins работают Linux. Тест также использует версию Spring 5.2.3.RELEASE.

...