Fitnesse SliM テストを Spring アプリケーションでトランザクション メソッドを実行すると、SQLException がスローされます - データ ソースが閉じられます。
私のアプリケーションでは、メソッド importFile(String filename) が csv ファイルを読み取り、データをデータベース内のいくつかのテーブルに更新します。これは、Spring アプリケーションのトランザクション メソッドです。そのため、ファイルの 1 つの行を更新すると例外がスローされる場合、この行のすべての更新はロールバックされ、他のすべての行 (前の行と次の行を含む) は更新され続けます。
関連リンクを参照してください:スプリング aop を使用してループ内で呼び出されるロールバック トランザクションを定義する方法は?
クエリテーブルSliM FitNesseページのテストステップ
1 設定ページでは、設定ファイルを使用してテスト データを設定します
|Query: Test Case | test_file_setup.csv |
| name | phone | email |
| tom | 123 | tom@test.com |
| dick | 456 | dick@test.com |
| harry | 789 |harry@test.com |
結果: テストに合格しました
2 テスト ページは、無効な行を含むテスト ファイルをテストするため、この行を実行すると、この行のみがロールバックされますが、他のすべての行は続行されますが、テストは失敗し、すべての行がロールバックされ、データ ソースが閉じられました。
3 したがって、有効なファイルを使用してテストし、データベースをクリーンアップしようとする TearDown も失敗したため、データ ソースが閉じられました。
これは 1 つの SliM テストですが、SetUp、Test、TearDown の各ページにクエリ テーブルがあります。私の推測では、1 つのフィットネス テストで 1 つの Spring コンテキスト インスタンスのみが開始されます。私が間違っているかどうか教えてください。ただし、このメソッドは spring config でトランザクションとして宣言されています。期待どおりにロールバックしますが、テストはそうではありません。
これが私のテストクラスです
public class TestCase{
private ImportFile importFile;
private String filename;
public TestCase(String filename){
this.filename = filename;
init();
}
public void init(){
//initialize the spring context
//and get beans...
importFile = (ImportFile) context.getBeans("importFile");
start();
}
public void start(){
//read rows from file...
for( ... loop per row...){
//this is a transactional method...
//it reads the file and update every row to the database
//it is supposed to row back one row (per loop)
//and continue if an exception thrown
//but it rollback the all rows and close the datasource
importFile.importFile(filename);
}
}
public List<Object> query(){
//read from database and return the test result to the Slim query table
...
cleanup();
}
public void cleanup(){
//close the spring context
...
}
}
テスト ページで、Fitnesse は SetUp、Test、TearDown で新しいテスト プロセスを開始する (新しい TestClass インスタンスを作成する) ようです。しかし、結果は私の間違いを証明しています?!