我选择通过为我的 DAO 实现几个方言助手类来解决这个问题。我的目标是
- 针对 HSQL 数据库而不是 Sybase 执行测试
- 尽可能多地测试我的生产 DAO,包括 RowMapper 和针对生产中使用的数据库模式的各种 SELECT/INSERT 语句(但在 HSQL 中实现)
我的 DAO 最终看起来像这样(注意被注入的 DialectHelper)......
@Repository
public class MyDaoJdbc MyDao {
private DialectHelper dialectHelper;
/* the meat of the DAO removed for clarity */
@Override
public void createTemporaryTable() {
getSimpleJdbcTemplate().update(dialectHelper.getTempTableCreateSql());
}
@Autowired
public final void setDialectHelper(DialectHelper dialectHelper) {
this.dialectHelper = dialectHelper;
}
}
...我的生产 Spring 配置 (spring-db.xml) 看起来像这样并注入了 Sybase 方言
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.sybase.jdbc2.jdbc.SybDriver" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="dialectHelper" class="com.acme.myapp.jdbc.DialectHelperSybase" />
...我的测试 Spring 配置(spring-db-test.xml)看起来像这样并注入了 HSQL 方言
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:/resources/schema.sql"/>
<jdbc:script location="classpath:/resources/test-data.sql"/>
</jdbc:embedded-database>
<bean id="dialectHelper" class="com.acme.myapp.dao.jdbc.DialectHelperHsql" />
DialectHelper 类提供了一种将不兼容的数据库语法从 DAO 中分离出来的方法......
public class DialectHelperHsql implements DialectHelper {
@Override
public String getTempTableCreateSql() {
return "create temporary table myTable (value varchar(12) NULL)";
}
}
public class DialectHelperSybase implements DialectHelper {
@Override
public String getTempTableCreateSql() {
return "create table #myTable (value varchar(12) NULL)";
}
}
Test 类本身通过加载文件 spring-db-test.xml 使用 HSQL dialectHelper 初始化 Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"classpath:resources/spring-context.xml",
"classpath:resources/spring-db-test.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class MyDaoIntegrationHsqlTest {
...
}