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 the Starter class
  • Use a spring Boot @ConditionalOn... annotation on the Starter 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.