1

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 インスタンスを作成する) ようです。しかし、結果は私の間違いを証明しています?!

4

0 に答える 0