Reputation: 442
Is there a possibility to replace a single bean or value from a Spring configuration for one or more integration tests?
In my case, I have the configuration
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"foo.bar"})
public class MyIntegrationTestConfig {
// everything done by component scan
}
Which is used for my integration test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MyIntegrationTest {
// do the tests
}
Now I want to have a second set of integration tests where I replace one bean by a different one.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MySpecialIntegrationTest {
// influence the context configuration such that a bean different from the primary is loaded
// do the tests using the 'overwritten' bean
}
What is the most simple way to achieve this?
Upvotes: 9
Views: 15978
Reputation: 10039
The Spring test framework is able to understand extension over configuration. It means that you only need to extend MySpecialIntegrationTest
from MyIntegrationTest
:
@ContextConfiguration(classes = MySpecialIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MySpecialIntegrationTest extends MyIntegrationTest {
@Configuration
public static class MySpecialIntegrationTestConfig {
@Bean
public MyBean theBean() {}
}
}
and create the necessary Java Config class and provide it to @ContextConfiguration
. Spring will load the base one and extend it with the one that you specialize in your extended test case.
Refer to the official documentation for further discussion.
Upvotes: 10