2015-04-02 48 views
1

我的Spring Java配置风格的配置与2点的数据源:春JUNIT数据源自动连接

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

但是,当我自动装配,在我的测试类的数据源和运行他:我得到了相同的结果:

@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

虽然它看起来像你使用2点的数据源,因此2个独立的数据库,你不是。您正在使用2个数据源,但使用单个数据库。 – 2015-04-02 09:57:08

+0

看起来像接线两个数据源只能帮助您验证正确的接线。将非测试数据源连接到测试中的用例是什么? – 2015-04-02 11:47:20

回答

3

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

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

你好得多使用Spring配置文件并分配测试数据源,以测试配置文件和数据源产生的默认配置文件,然后设置有效简表,您的测试用例是测试。

下面是一个例子:

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

请注意,您可以把@profile注释对单个Bean或配置类。

+0

thx,真的很有帮助 – MeetJoeBlack 2015-04-02 11:52:07