私は、DAO に方言ヘルパー クラスをいくつか実装することで、この問題を解決することにしました。私の目標は
- Sybase の代わりに HSQL データベースに対してテストを実行する
- RowMapper やさまざまな SELECT/INSERT ステートメントを含め、実稼働環境で使用されている (ただし HSQL で実装されている) データベース スキーマに対して、できるだけ多くの実稼働環境の DAO をテストします。
私の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 {
...
}