1. Overview
In this quick tutorial, we’ll discuss how to exclude auto-configuration classes from Spring Boot tests.
Spring Boot’s auto-configuration feature is very handy, as it takes care of a lot of setup for us. However, this can also be an issue during testing if we don’t want a certain auto-configuration to interfere with our tests of a module.
A common example of this is the security auto-configuration, which we’ll also use for our examples.
2. Test Example
First, we’ll take a look at our testing example.
We’ll have a secured Spring Boot application with a simple home page.
When we try to access the home page without authentication, the response is “401 UNAUTHORIZED”.
Let’s see this in a test that uses REST-assured to make the call:
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) public class AutoConfigIntegrationTest { @Test public void givenNoAuthentication_whenAccessHome_thenUnauthorized() { int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); assertEquals(HttpStatus.UNAUTHORIZED.value(), statusCode); } }
On the other hand, we can access the home page successfully with authentication:
@Test public void givenAuthentication_whenAccessHome_thenOK() { int statusCode = RestAssured.given().auth().basic("john", "123") .get("http://localhost:8080/") .statusCode(); assertEquals(HttpStatus.OK.value(), statusCode); }
In the following sections, we’ll try different ways to exclude the SecurityAutoConfiguration class from our tests’ configuration.
3. Using @EnableAutoConfiguration
There are multiple ways to exclude a specific Auto-configuration class from tests’ configuration.
First, let’s see how we can use the @EnableAutoConfiguration(exclude={CLASS_NAME}) annotation:
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) @EnableAutoConfiguration(exclude=SecurityAutoConfiguration.class) public class ExcludeAutoConfigIntegrationTest { @Test public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() { int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); assertEquals(HttpStatus.OK.value(), statusCode); } }
In this example, we excluded the SecurityAutoConfiguration class using the exclude attribute, but we can do the same with any of the auto-configuration classes.
Now we can run our test that accesses the home page without authentication and it will no longer fail.
4. Using @TestPropertySource
Next, we can use @TestPropertySource to inject the property “spring.autoconfigure.exclude“:
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) @TestPropertySource(properties = "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration") public class ExcludeAutoConfigIntegrationTest { // ... }
Note that we need to specify the full class name (package name+simple name) for the property.
5. Using Profiles
We can also set the property “spring.autoconfigure.exclude” for our tests using profiles:
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) @ActiveProfiles("test") public class ExcludeAutoConfigIntegrationTest { // ... }
And include all “test” profile specific properties in application-test.properties:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
6. Using a Custom Test Configuration
Finally, we can use a separate configuration application for our tests:
@RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT) public class ExcludeAutoConfigIntegrationTest { // ... }
And exclude the auto-configuration class from @SpringBootApplication(exclude={CLASS_NAME}):
@SpringBootApplication(exclude=SecurityAutoConfiguration.class) public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } }
7. Conclusion
In this article, we explored different ways to exclude auto-configuration classes from Spring Boot tests.
The full source code is available over on GitHub.