我获得了带有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。
答案 0 :(得分:3)
测试代码将按类型自动装配。我很惊讶你没有得到一个非唯一的bean异常。
麻烦的是你有两个豆子,其中一个是合格的,其中一个不是。
最好使用Spring配置文件并将测试数据源分配给测试配置文件,将生产数据源分配给默认配置文件,然后将测试用例的活动配置文件设置为测试。
以下是一个例子:
http://fahdshariff.blogspot.co.uk/2012/09/spring-3-javaconfig-unit-testing-using.html
请注意,您可以将@Profile注释放在单个bean或配置类上。