10. Testing support

10.1. JavaConfigContextLoader

The TestContext framework, first released with Spring 2.5 provides comprehensive support for system testing using the JUnit and TestNG testing frameworks. JavaConfig provides integration with the TestContext framework via JavaConfigContextLoader.

package com.bank;

/**
 * Configures the TransferService application
 */
@Configuration
public class TransferAppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl(accountRepository());
    }

    @Bean
    public AccountRepository accountRepository() {
        return new JdbcAccountRepository(dataSource());
    }

    @Bean
    public DataSource dataSource() {
        // create and return a new DataSource
    }
}
            

/**
 * System tests for the TransferService application
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="com.bank.TransferAppConfig",
                      loader=JavaConfigContextLoader.class)
public class TransferServiceTests {
    // autowire in the beans to test from the TransferServiceApp application context
    @Autowired TransferService transferService;

    SimpleJdbcTemplate jdbcTemplate;

    // DataSource parameter gets autowired from the TransferServiceApp context
    @Autowired
    void initJdbcTemplate(DataSource dataSource) {
        this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

    @Test
    public void testTransferFunds() {
        String balQuery = "select balance from accounts where id=?";

        // execute assertions against the jdbcTemplate that
        // prove initial conditions are correct
        assertThat(jdbcTemplate.queryForObject(balQuery, double.class, "2", equalTo(100.00d);

        // transfer 300 dollars from account with id 1 to account with id 2
        transferService.transfer(300.00d, "1", "2");

        // execute assertions against the jdbcTemplate that
        // the database has been updated properly.
        assertThat(jdbcTemplate.queryForObject(balQuery, double.class, "2", equalTo(400.00d);
    }

    // additional @Test methods...
}
            

[Note]Note
Unfortunately, due to compatibility constraints with the TestContext framework's @ContextConfiguration annotation, the fully-qualified classname for com.bank.TransferAppConfig must be expressed as a string. This has a negative effect on refactorability, and will be improved in the future if possible. Vote for SJC-238 if this improvement is important to you.