Alexander Kjäll
Alexander Kjäll

Reputation: 4336

reduce spring ContextConfiguration boilerplate in tests

I was wondering if there is a way to reduce the amount of boilerplate that we are currently writing for out integration tests.

The main culprit is ContextConfiguration that we send 7 distinct strings into currently.

One of our tests looks like this (payload code removed):

@ContextConfiguration(locations = {"classpath:properties-config.xml",
        "classpath:dataSources-config.xml",
        "classpath:dao-config.xml",
        "classpath:services-config.xml",
        "classpath:ehcache-config.xml",
        "classpath:test-config.xml",
        "classpath:quartz-services.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
@Category(IntegrationTest.class)
public class TerminalBuntsPDFTest {
    @Autowired
    private JobService jobService;

    @Test
    public void testCode() throws SystemException {
        assertTrue("Success", true);
    }
}

And the specification of what xml files to load takes up a lot of space. We are in a (very slow) process of migrating away from xml towards annotations, but there is a lot of work left to do in that project.

We are using spring 3.2.

Upvotes: 1

Views: 204

Answers (2)

cowls
cowls

Reputation: 24334

The annotation based approach is to create a Spring Configuration Java class like this:

@Configuration("testConfig")
@ImportResource({
    "dataSources-config.xml",
    "dao-config.xml",
    "services-config.xml"
})
public class TestConfiguration {

    // TO create a spring managed bean
    @Bean
    MyBean myBean() {
        return new MyBean();
    }

}

Then you can annotate your test class like so to load the configuration:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
    classes=TestConfiguration.class,
    loader=AnnotationConfigContextLoader.class
)
@Category(IntegrationTest.class)
public class TerminalBuntsPDFTest {

This is just a light example that probably won't compile but should get you on the right track

Some relevant docs:

http://www.tutorialspoint.com/spring/spring_java_based_configuration.htm

http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

Upvotes: 1

przemek hertel
przemek hertel

Reputation: 4014

What about such pattern:

@ContextConfiguration(locations = {"classpath:properties-config.xml",
        "classpath:dataSources-config.xml",
        "classpath:dao-config.xml",
        "classpath:services-config.xml",
        "classpath:ehcache-config.xml",
        "classpath:test-config.xml",
        "classpath:quartz-services.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
@Category(IntegrationTest.class)
public abstract class BaseTest {
}

// ....

public class TerminalBuntsPDFTest extends BaseTest {
    @Autowired
    private JobService jobService;

    @Test
    public void testCode() throws SystemException {
        assertTrue("Success", true);
    }
}

// ....

public class TerminalBuntsPDFTest2 extends BaseTest {}

This will allow you to place configuration only once in parent abstract class.

Upvotes: 1

Related Questions