10. Testing support
Prev |  | Next

## 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
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.

Prev |  | Next
9. JMX support | Home | 11. Extending JavaConfig