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 {
}
это работает для меня.
для дальнейшего чтения перейдите к этой блог.