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