Spring JUNIT数据源自动装配

时间:2015-04-02 09:54:26

标签: java spring junit spring-jdbc

我获得了带有2个数据源的Spring Java Config样式配置:

@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());
    }

但是当我在我的Test类中自动发送数据源并运行他时:我得到了相同的结果:

@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()将相同的rowCount字符串记录为findRealDb(),但正如您所见,它们使用不同的数据源来构建jdbcTemplate。

enter image description here

1 个答案:

答案 0 :(得分:3)

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

麻烦的是你有两个豆子,其中一个是合格的,其中一个不是。

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

以下是一个例子:

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

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