Spring boot ComponentScan excludeFIlters не исключая

Я SimpleTest :

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SimpleTestConfig.class)
public class SimpleTest {
    @Test
    public void test() {
        assertThat(true);
    }
}

и a конфигурация для теста :

@SpringBootApplication
@ComponentScan(basePackageClasses = {
        SimpleTestConfig.class,
        Application.class
},
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ASSIGNABLE_TYPE,
                classes = Starter.class))
public class SimpleTestConfig {
}

Я пытаюсь исключить стартер класс

package application.starters;

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class Starter {
    @PostConstruct
    public void init(){
        System.out.println("initializing");
    }
}

и приложение

3 ответов


каждый компонент сканирования делает фильтрацию по отдельности. Пока вы исключаете Starter.class С SimpleTestConfig, SimpleTestConfig инициализирует Application, который делает его собственные @ComponentScan без учета Starter. Чистый способ использования ComponentScan для каждого ComponentScan для сканирования отдельных пакетов, таким образом, каждый фильтр работает нормально. Когда 2 отдельных ComponentScans сканируют один и тот же пакет (как в ваших тестах), это не работает.

один из способов обмануть это, чтобы обеспечить макет Starter бин:

import org.springframework.boot.test.mock.mockito.MockBean;

public class SimpleTest {
    @MockBean
    private Starter myTestBean;
    ...
}

весна будет использовать этот макет вместо реального класса, таким образом,@PostConstruct метод не будет вызван.

другие общие решения:

  • не использовать напрямую Application.class в любом модульном тесте
  • используйте профиль Весны и аннотации, такие как @Profile("!TEST") на Starter класс
  • используйте пружинную загрузку @ConditionalOn... аннотация Starter класс

@SpringBootApplication, согласно документации весны делает совмещенную функциональность: @Configuration, @EnableAutoConfiguration и @ComponentScan в одном формате.

сначала попробуйте без уточнения сканирования пакета (без фильтра basePackages).

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

вы можете определить пользовательский фильтр сканирования компонентов для его исключения.

пример кода будет выглядеть так:

@SpringBootApplication()
@ComponentScan(excludeFilters=@Filter(type = FilterType.REGEX, pattern="com.wyn.applications.starter.Starter*"))
public class SimpleTestConfig {

}

это работает для меня.

для дальнейшего чтения перейдите к этой блог.