In the following sections, we’ll show how ApplicationContextRunner simplifies auto-configuration testing.
2. Test Auto-Configuration Scenarios
ApplicationContextRunner is a utility class which runs the ApplicationContext and provides AssertJ style assertions. It’s best used as a field in test class for shared configuration and we make customizations in each test afterward:
Let’s move on to show its magic by testing a few cases.
2.1. Test Class Condition
In this section, we’re going to test some auto-configuration classes which use @ConditionalOnClass and @ConditionalOnMissingClass annotations:
We’d like to test whether the auto-configuration properly instantiates or skips the created and missed beans given expected conditions.
ApplicationContextRunner gives us the withUserConfiguration method where we can provide an auto-configuration on demand to customize the ApplicationContext for each test.
The run method takes a ContextConsumer as a parameter which applies the assertions to the context. The ApplicationContext will be closed automatically when the test exits:
Through the preceding example, we see the simpleness of testing the scenarios in which a certain class is present on the classpath. But how are we going to test the converse, when the class is absent on the classpath?
This is where FilteredClassLoader kicks in. It’s used to filter specified classes on the classpath at runtime:
2.2. Test Bean Condition
We’ve just looked at testing @ConditionalOnClass and @ConditionalOnMissingClass annotations, now let’s see what things look like when we are using @ConditionalOnBean and @ConditionalOnMissingBean annotations.
To make a start, we similarly need a few auto-configuration classes:
Then, we’d call the withUserConfiguration method like the preceding section and send in our custom configuration class to test if the auto-configuration appropriately instantiates or skips createOnBean or createOnMissingBean beans in different conditions_:_
2.3. Test Property Condition
In this section, let’s test the auto-configuration classes which use @ConditionalOnProperty annotations.
First, we need a property for this test:
After that, we write nested auto-configuration classes to create beans based on the preceding property:
Now, we’re calling the withPropertyValues method to override the property value in each test:
3. Conclusion
To sum up, this tutorial just showed how to use ApplicationContextRunner to run the ApplicationContext with customizations and apply assertions.
We covered the most frequently used scenarios in here instead of an exhaustive list of how to customize the ApplicationContext.
In the meantime, please bear in mind that the ApplicationConetxtRunner is for non-web applications, so consider WebApplicationContextRunner for servlet-based web applications and ReactiveWebApplicationContextRunner for reactive web applications.
The source code for this tutorial can be found over on GitHub.