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。
我得到了 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。