5

I'm trying to run a @SpringBootTest in a "clean" context without having MyApplicationContextInitializer executed.

The MyApplicationContextInitializer is included inside the spring.factories file in a compile-scope dependency like this:

org.springframework.context.ApplicationContextInitializer=\
com.eremic.myapp.MyApplicationContextInitializer

Test class:

@SpringBootTest(webEnvironment = RANDOM_PORT)
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestContext.class)
public class UsersControllerTest {}

Test config:

@SpringBootConfiguration
public class TestContext {}

Is there a way to exclude MyApplicationContextInitializer from @SpringBootTest?

I've already tired with excludeFilters @ComponentScan.Filters, but it has no effect on ApplicationContextInitializer.

Also, I've tried to annotate TestContext with @SpringBootApplication and to limit component scanning with scanBasePackages and/or to use exclude = MyApplicationContextInitializer.class but it has no effect too.

So far the only way to prevent MyApplicationContextInitializer from executing inside @SpringBootTest is to remove the maven dependency in which the MyApplicationContextInitializer is declared.

eremic
  • 113
  • 9

2 Answers2

2

There's not currently a way to filter ApplicationContextInitializer classes loaded from factories. To do that on a per-test level you'd need to use a custom annotation that uses a different SpringBootTestContextBootstrapper. The bootstrapper would need to return a SpringBootContextLoader that filtered the initializers. Feel free to raise an issue and we can add some protected method to SpringBootContextLoader for you to override.

Phil Webb
  • 8,119
  • 1
  • 37
  • 37
0

For those who are interested in how exclusions of ApplicationContextInitializer were made possible in SpringBoot (by @phil_webb).

You have to extend org.springframework.boot.test.context.SpringBootContextLoader and override getInitializers method:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootContextLoader;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.test.context.MergedContextConfiguration;

import java.util.List;

/**
 * Custom context loader for modifying {@code ApplicationContextInitializer}'s
 */
public class CustomInitializersContextLoader extends SpringBootContextLoader {

    @Override
    protected List<ApplicationContextInitializer<?>> getInitializers(MergedContextConfiguration config,
                                                                     SpringApplication application) {
        // modify list of initializers however you need
        return super.getInitializers(config, application);
    }

}

And then you can enable this loader with org.springframework.test.context.ContextConfiguration:

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest
@ContextConfiguration(loader = CustomInitializersContextLoader.class)
public abstract class DemoTest {
    // regular tests
}
Dmitry Smorzhok
  • 635
  • 11
  • 21