Override a single @Configuration class on every spring boot @Test
Inner test configuration
Example of an inner @Configuration for your test:
@RunWith(SpringRunner.class)@SpringBootTestpublic class SomeTest { @Configuration static class ContextConfiguration { @Bean @Primary //may omit this if this is the only SomeBean defined/visible public SomeBean someBean () { return new SomeBean(); } } @Autowired private SomeBean someBean; @Test public void testMethod() { // test }}
Reusable test configuration
If you wish to reuse the Test Configuration for multiple tests, you may define a standalone Configuration class with a Spring Profile @Profile("test")
. Then, have your test class activate the profile with @ActiveProfiles("test")
. See complete code:
@RunWith(SpringRunner.class)@SpringBootTests@ActiveProfiles("test")public class SomeTest { @Autowired private SomeBean someBean; @Test public void testMethod() { // test }}@Configuration@Profile("test")public class TestConfiguration { @Bean @Primary //may omit this if this is the only SomeBean defined/visible public SomeBean someBean() { return new SomeBean(); }}
@Primary
The @Primary
annotation on the bean definition is to ensure that this one will have priority if more than one are found.
You should use spring boot profiles:
- Annotate your test configuration with
@Profile("test")
. - Annotate your production configuration with
@Profile("production")
. - Set production profile in your properties file:
spring.profiles.active=production
. - Set test profile in your test class with
@Profile("test")
.
So when your application starts it will use "production" class and when test stars it will use "test" class.
If you use inner/nested @Configuration
class it will be be used instead of a your application’s primary configuration.
I recently had to create a dev version of our application, that should run with dev
active profile out of the box without any command line args. I solved it with adding this one class as a new entry, which sets the active profile programmatically:
package ...;import org.springframework.boot.SpringApplication;import org.springframework.context.annotation.Import;import org.springframework.core.env.ConfigurableEnvironment;import org.springframework.core.env.StandardEnvironment;@Import(OriginalApplication.class)public class DevelopmentApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(DevelopmentApplication.class); ConfigurableEnvironment environment = new StandardEnvironment(); environment.setActiveProfiles("dev"); application.setEnvironment(environment); application.run(args); }}
See Spring Boot Profiles Example by Arvind Rai for more details.