Spring JUNIT 数据源自动装配

Spring JUNIT datasource autowiring

我得到了 Spring Java 具有 2 个数据源的配置样式配置:

@Configuration
@EnableTransactionManagement
public class DBConfig {

    // main db
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .addScript("classpath:schema.sql")
                .addScript("classpath:data.sql")
                .build();
    }
    //db for test    
    @Bean(name = "testDataSource")
    public DataSource testDataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .addScript("classpath:schema.sql")
                .addScript("classpath:test-data.sql")
                .build();
    }


    @Bean
    public JdbcTemplate jdbcTemplate(){
        return new JdbcTemplate(dataSource());
    }

但是当我在我的测试 class 和 运行 中自动连接该数据源时,他:我得到了相同的结果:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DBConfig.class)
@Transactional
public class JdbcTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    @Qualifier("testDataSource")
    private DataSource testDataSource;

    @Test
    public void findRealDb() {
        String rowCount =  jdbcTemplate.queryForObject("select message from messages", String.class);
        System.out.println("real db "  + rowCount);
    }


    @Test
    public void findTestDb() {
        String rowCount = (new JdbcTemplate(testDataSource).queryForObject("select message from messages", String.class));
        System.out.println("test db " + rowCount);
    }
}

结果方法 findTestDb() 记录与 findRealDb() 相同的 rowCount 字符串,但如您所见,它们使用不同的数据源来构建 jdbcTemplate。

测试代码将按类型自动装配。我很惊讶你没有得到非唯一的 bean 异常。

问题是你有两个豆子,一个合格,一个不合格。

最好使用 Spring 配置文件并将测试数据源分配给测试配置文件,将生产数据源分配给默认配置文件,然后为要测试的测试用例设置活动配置文件。

这是一个例子:

http://fahdshariff.blogspot.co.uk/2012/09/spring-3-javaconfig-unit-testing-using.html

请注意,您可以将 @Profile 注释放在单个 bean 或配置上 class。