2015-04-02 43 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