junitクラスに@Transactionalアノテーションを付けると、Springは@Testメソッド間で共有され、最後にロールバックされるトランザクションを1つだけ作成することを理解したいと思います。一方、代わりに各@Testに@Transactionalのマークを付けると、新しいトランザクションが作成され、@Testベースでロールバックされます。公式ドキュメント(リンク)で期待される動作を完全に見つけることができませんでした。
2 に答える
クラス@Transactional
レベルに配置することは、各テストメソッドに配置することと同じです。
最初のシナリオ、つまりすべてのテストに対して1つのトランザクションを実行する簡単な方法はないと思います。テストはランダムな順序で実行されるため、お互いの変更を確認することに頼ることができないため、とにかく意味があるかどうかはわかりません。もちろん、1回のトランザクションで1回のuber-testからメソッドを明示的に呼び出すことができます。
@Transactional
JUnitテストケースでは、クラスレベルで各テストメソッドの前に新しいトランザクションを開始し、後でロールバックします。
テストクラスの開始時に新しいトランザクションを簡単に開始して、クラス全体で開いたままにすることはできません。少なくともSpringはこれをサポートしていません。最初の回避策は@BeforeClass
/@AfterClass
ペアを使用するstatic
ことですが、トランザクションマネージャーにアクセスできないようにする必要があります。
しかし、最初に自分自身に質問してください、なぜあなたはこれをしたいのですか?一方のテストは、もう一方の出力またはデータベースの副作用に依存しているように聞こえます。これはテストにおける大きなアンチパターンであり、JUnitはテストメソッドが実行される順序を保証しないことは言うまでもありません。たぶん、各テストケースの前にデータベースをセットアップする必要がありますか?@Before
と@After
Springトランザクションのコンテキスト内で実行されるため、そこで使用できます。