共通のユニットテストフレームワークの思考と設計06-実装編-テストデータの自動管理-データ外部キー制約を一時的に閉じる方法


第4節ではdbunitプラグインによるテストデータの自動管理を提案したが、実際の操作でいくつかの問題が発見され、データベーステーブルの設計時に各テーブル間に外部キー関連がある可能性があり、テストデータベースの準備中に外部テストデータの外部キーの問題でデータを挿入できなかったり、テストデータの整理中にテストデータの順序の問題でテストデータの削除に成功しなかったりすることがよくある.どうやってこの問題を解決しますか?
ここでは、データベースの外部キー制約を一時的に削除し、テストが完了した後、データを以前の状態に復元する、バカですが直接的な方法を使用します.
操作手順
1.AbstractDatasetProviderListenerクラスのbeforeTestメソッドの前に外部キー制約を除去する
String[] tables = dataSet.getTableNames();
if(tables != null){
   for(String table : tables){
	databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" NOCHECK CONSTRAINT all").execute();
   }
}
databaseTester.onSetup();
現在のデータセットで操作されているテーブルを取得し、各テーブルに対してdisable外部キー制約操作を実行させ、onSetup操作を実行させる
2.AbstractDatasetProviderListenerクラスのdafterTestメソッドの実行後に外部キー制約を追加
databaseTester.setTearDownOperation(InsertIdentityOperation.DELETE);
databaseTester.onTearDown();
String[] tables = databaseTester.getDataSet().getTableNames();
if(tables != null){
   for(String table : tables){
	databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" CHECK CONSTRAINT ALL").execute();
   }
}
はステップ1の逆ステップであり、テストデータの処理が完了した後、以前のdisableから削除された外部キーに対して追加制約機能を1つずつ有効にする
問題&まとめ
問題は解決したが、実際のテスト前に外部キー制約を削除した場合、実際のビジネスクラスで発生したデータベース操作が外部キー制約に従ってデータを操作していない場合、データベースはエラーを報告しないため、ユニットテストの結果が正しい(外部キー制約が無効)という問題が発生する可能性があります.しかし、実際の環境では結果が間違っています(データが制約に反しています)