spike
spike

Reputation: 442

Overwrite Java based Spring Context Configuration for Tests

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

Answers (1)

nobeh
nobeh

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

Related Questions