Oracle ではなく HSQL を使用して MyBatis の単体テストを行う
質問
HSQL インメモリ データベースを使用して MyBatis 永続層の単体テストをしたいと考えています。実際のアプリケーションは Oracle データベースを使用します。ID 列に自動増分番号を追加し始めた限り、これはうまく機能しました。Oracle では、インクリメントされた数値を取得するためにシーケンスを使用する必要があるため、Oracle データベースに「basic_seq」というシーケンスが作成されました。MyBatis マッパー XML ファイルには次のようなものがあります。
<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id">
<selectKey resultType="long" keyProperty="id" order="BEFORE">
SELECT basis_seq.NEXTVAL FROM DUAL
</selectKey>
insert into basis
(id, name)
values
(#{id}, #{name})
</insert>
これはアプリケーションを実行すると機能しますが、単体テストでエラーが発生します。
org.springframework.jdbc.BadSqlGrammarException:キーの選択または[[結果]をパラメーターオブジェクトに設定するエラー。原因:java.sql.SQLSyntaxErrorException:ユーザーには特権やオブジェクトが見つかりません:デュアル;間違った SQL 文法 [];ネストされた例外はjava.sql.sqlsyntaxerrorexceptionです。ユーザーには特権やオブジェクトが見つかりません:デュアル
私が理解しているように、「DUAL」はシーケンスを保存するOracleのある種の仮想テーブルであり、テストデータベースにはこれがありません。を削除すると、 <selectKey>
- 単体テストの動作にタグを付けます (HSQL はマークされた列の ID を自動生成できるため) identity
) しかし、実際のアプリケーションではありません。回避策の 1 つは、単体テスト用に別の MyBatis マッパー XML ファイルを作成することです。 <selectKey>
-tag ですが、実際の構成をテストしたいので、これは望ましくありません。
HSQL でもシーケンスを作成して使用する方法はありますか、あるいはこれに対する MyBatis の回避策はありますか?それとも、単体テストには H2 などの別のデータベースを使用する必要がありますか?
私が使う:
- スプリング 3.0.5
- HSQL 2.2.4
- MyBatis 3.0.5
アップデート:
からの回答を得た後、 フレッド, Spring 構成を編集した方法は次のとおりです。
データ ソースを次のように定義する前に、
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:test-data/schema.sql" />
<jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>
今、私はこれをします:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:test-data/schema.sql" />
<jdbc:script location="classpath:test-data/data.sql" />
</jdbc:initialize-database>
また、schema.sql でシーケンスを作成する必要があります。
CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;
(単体テスト中にこのスクリプトを何度も実行する場合は、忘れずに追加してください drop sequence BASIS_SEQ if exists;
schema.sql の先頭へ)
解決
最新の HSQLDB は、広範な Oracle 構文互換性を提供します。必要なのは追加することだけです sql.syntax_ora=true
データベースの URL に。例えば:
jdbc:hsqldb:mem:test;sql.syntax_ora=true
ガイドを参照
http://hsqldb.org/doc/2.0/guide/deployment-chapt.html
http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html
SQL 構文の互換性は、HSQLDB の新しいバージョンで常に拡張されているため、利用可能な最新バージョンを使用することが最善です。
他のヒント
元の4行構成を使用して使用できます <jdbc:embedded-database ...>
. 。 Test-data/schema.sqlファイルの先頭に次の行を追加するだけです。
SET DATABASE SQL SYNTAX ORA TRUE;
これは、Appendingと同じです sql.syntax_ora=true
JDBC URLに。