IDENTITY列を含むテストデータの投入

SQL ServerのIDENTITY列(ID列と略記)をプライマリキーに指定しているテーブルに対してS2Unit.NETのReadXlsWriteDb()メソッドを使用してテストデータを投入する場合、ID列をテストデータに含めることができません。(「…ID 列に明示的な値を挿入できません。」のSQLエラーが発生)

そのため、テストデータの投入が困難です。
ID列を外部キーに使用している場合、更に困難です。

解決策として次の方法を考えています。

  • ID列の自動生成を一時的に無効にする。
  • ID列の値を自前で生成する。
  • Mockオブジェクトを使用する。

ID列の自動生成を一時的に無効にする。

SQL Serverの場合、SET IDENTITY_INSERTプロパティをONにすることでID 列に明示的な値を挿入できます。
しかし、セッション内の1つのテーブルのみSET IDENTITY_INSERTプロパティをONに出来ないので
S2Unit.NETでテストデータの投入直前に設定する必要があります。
具体的には、Seasar.Extension.DataSets.ITableWriterインターフェースの実装クラスにSET IDENTITY_INSERTプロパティをONにする処理を組み込みます。
上記の処理は、SQL Serverの場合のみ有効なのでS2Unit.NETでITableWriterの実装クラスを切り替えられるようにする必要があります。

ID列の値を自前で生成する。

ID列の指定を止めてアプリケーション側から指定します。
この場合、アプリケーション側でIDの自動生成処理を組み込むのも無駄なのでHibernateのhiloジェネレータ相応の機能がS2Daoに欲しいところです。

Mockオブジェクトを使用する。

テストデータの読み書き時にデータベースにアクセスしないようにします。
具体的には、DaoクラスをMockオブジェクトに置き換えます。
単体テストレベルだとこの方法で問題ないと思います。
データベースの読み書きが正常終了することまでをテストする場合、上記の方法は使えません。

SQL Serverでsequenceが使えれば上記問題が解決するのですが…。

追記

MySQLの場合、ID列に明示的な値を挿入できる。この場合、次に挿入されるID値は「MAX(ID値)+1」になる(ように見える)。
DB2の場合、GENERATED BY DEFAULTとして定義されたID列に明示的な値を挿入できる
SQL Serverだけの問題っぽい。

参考URL:
http://www-06.ibm.com/jp/software/data/developer/library/techdoc/movingdata.html