6

SpringコアとJPAをDB2で使用するアプリケーションにJUnit4を実装しました。あるデータベースからデータを取得して別のデータベースにマージする完全な機能をテストする必要があります。

1番目のデータベースからデータを取得するためのテストケースが作成され、エラーなしで完全に実行されていますが、レコードは2番目のデータベースに保存されていません。

実装

TestCaseクラスには、必要に応じてトランザクションでテストケースを実行するために、次のアノテーションが含まれています。

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
      DependencyInjectionTestExecutionListener.class,    
      TransactionalTestExecutionListener.class})
@ContextConfiguration(locations={""})
@TransactionConfiguration(transactionManager="defaultTransactionManager", defaultRollback=false)
@Transactional

アプリケーションには、doSynch()メソッドを使用してこの操作を実行するためのマネージャークラスがあります。そのメソッドから、crudHelperクラスのtxStore()メソッドが呼び出されて初期化され、doStore()メソッド(同じクラス内)が呼び出されてエンティティがデータベースにマージされます。

以下は、このテストケースロジック全体のトランザクション宣言です。

TestCase testSynch() - @Transactional(propagation=Propagation.SUPPORTS)
Manager doSynch() - @Transactional(propagation=Propagation.NEVER)
CRUDHelper txStore() - @Transactional(propagation=Propagation.REQUIRED)
           doStore() - No Transactional annotation

doSynch()は、その時点ではトランザクションを必要としないため、NEVERとしてマークされ、CRUDHelperなどのさらなるレベルでは、トランザクションを確実に使用可能にするためにトランザクションをREQUIREDとしてマークできます。

問題

ここで、マネージャーのdoSynch()メソッドを呼び出して機能をテストするテストケースを実行すると、レコードがマージされず、エラーがスローされないことを除いて、完全なフローが完全に機能します。

JSPから呼び出された場合のManagerメソッドはうまく機能します。また、テストケースから直接txStore()を呼び出してテストしましたが、これも正常に機能します。

トランザクション管理が適切でないかどうか、またはこの問題の回避策がさらに役立つかどうかをお知らせください。また、問題や環境が明確でない場合は、plsが私を更新します。前もって感謝します。!!

4

1 に答える 1

6

メソッドに@Rollbackアノテーションを付けていますか?

JavaDocから:

テストアノテーションは、テストメソッドの完了後にアノテーション付きテストメソッドのトランザクションをロールバックする必要があるかどうかを示します。trueの場合、トランザクションはロールバックされます。それ以外の場合、トランザクションはコミットされます。

于 2010-08-17T11:07:18.820 に答える