Spring boot ComponentScan excludeFIlters not excluding
Each component scan does filtering individually. While you exclude Starter.class
from SimpleTestConfig
, SimpleTestConfig
initializes Application
, which does it's own @ComponentScan
without excluding Starter
.
The clean way of using ComponentScan is for each ComponentScan to scan separate packages, that way each filter works fine. When 2 separate ComponentScans scan the same package (as in your tests), this does not work.
One way to trick this is to provide a mock Starter
bean:
import org.springframework.boot.test.mock.mockito.MockBean;
public class SimpleTest {
@MockBean
private Starter myTestBean;
...
}
Spring will use that mock instead of the real class, thus the @PostConstruct
method will not be called.
Other common solutions:
- Do not directly use
Application.class
in any unit test - Use Spring profile and annotations such as
@Profile("!TEST")
on theStarter
class - Use a spring Boot
@ConditionalOn...
annotation on theStarter
class
You can define custom component scan filter for excluding it.
Example code will be like:
@SpringBootApplication()
@ComponentScan(excludeFilters=@Filter(type = FilterType.REGEX, pattern="com.wyn.applications.starter.Starter*"))
public class SimpleTestConfig {
}
This works for me.
For further reading go to this blog.