ComponentScan игнорирует excludeFilters (в тесте) - PullRequest
0 голосов
/ 25 января 2020

Я не могу понять, как исключить конфигурацию (например, как , описанную здесь ) в тесте. Что я действительно хочу, так это игнорировать конфигурацию в @WebMvcTest, но даже следующий простой пример не работает для меня:

@ExtendWith(SpringExtension.class)
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
        ComponentScanTest.ExcludedConfig.class }))
class ComponentScanTest {

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    void testInclusion() throws Exception { // This test succeeds, no exception is thrown.
        applicationContext.getBean(IncludedBean.class); 
    }

    @Test
    void testExclusion() throws Exception { // This test fails, because ExcludedBean is found.
        assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(ExcludedBean.class));
    }

    @Configuration
    static class IncludedConfig {
        @Bean
        public IncludedBean includedBean() {
            return new IncludedBean();
        }
    }

    static class IncludedBean { }

    @Configuration
    static class ExcludedConfig {
        @Bean
        public ExcludedBean excludedBean() {
            return new ExcludedBean();
        }
    }

    static class ExcludedBean { }
}

Почему ExcludedBean находится в testExclusion()? Как правильно исключить конфигурацию?

1 Ответ

1 голос
/ 27 января 2020

Приведенный выше тестовый класс пройдет с аннотацией @Profile для управления созданием компонента.

@ExtendWith(SpringExtension.class)
@ComponentScan
@ActiveProfiles("web")
class ComponentScanTest {

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    void testInclusion() throws Exception { // This test succeeds, no exception is thrown.
        applicationContext.getBean(IncludedBean.class);
    }

    @Test
    void testExclusion() throws Exception { // This test fails, because ExcludedBean is found.
        assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(ExcludedBean.class));
    }

    @Configuration
    @Profile("web")
    static class IncludedConfig {
        @Bean
        public IncludedBean includedBean() {
            return new IncludedBean();
        }
    }

    static class IncludedBean {
    }

    @Configuration
    @Profile("!web")
    static class ExcludedConfig {
        @Bean
        public ExcludedBean excludedBean() {
            return new ExcludedBean();
        }
    }

    static class ExcludedBean {
    }
}

Обновление : следующий код работает на @ComponentScan

Создайте класс конфигурации и аннотируйте с помощью @ComponentScan при необходимости

@Configuration
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
        ComponentScanTest.ExcludedConfig.class }))
public class TestConfiguration {

}

и предоставьте ApplicationContext для тестового класса следующим образом

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes= {TestConfiguration.class})
class ComponentScanTest {
  //.. Everything else remains the same.
}
...