私は当社の既存の春のJUnitテストで@TransactionalEvents
をテストするために(春4.2 https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2の機能を)しようとしてきた(@TransactionalTestExecutionListener
またはサブクラスAbstractTransactionalUnit4SpringContextTests
のいずれかを介して実行しますが、強制選択がありますように思えます - 。 - @Rollback
注釈なしでテストを実行するか、イベントは発生しません。どちらか誰もがテストを@Rollbackできる一方@TransactionalEventsをテストする良い方法渡って来たテスト@TransactionalEventsと@Rollback
答えて
ステファン・ニコルが正しい:TransactionPhase
のためか? @TransactionalEventListener
がAFTER_COMMIT
に設定されている場合、自動ロールバックセマンティクスを使用したトランザクションテストでは意味をなさない発砲した。
つまり、トランザクションがコミットされていない場合、そのトランザクションがコミットされていない場合、イベントを起動させる方法はありません。
実際にイベントを発生させるには、トランザクションをコミットする必要があります(たとえば、テストメソッドに@Commit
と注釈を付ける)。コミット後にクリーンアップするには、トランザクションがコミットされたの後に、のモードで@Sql
を使用してクリーンアップスクリプトを実行するモードを使用できるようにする必要があります。例えば、次の(未テストコード)のようなものは、あなたのために働くかもしれない:
@Transactional
@Commit
@Sql(scripts = "/cleanup.sql", executionPhase = AFTER_TEST_METHOD,
config = @SqlConfig(transactionMode = TransactionMode.ISOLATED))
@Test
public void test() { /* ... */ }
よろしく、
サム(春TestContextフレームワークの著者)
ありがとう、ありがとう。私はこの作業をしてきたので、私の理解の一部は、伝播に関係なくネストされた\ @Transactionalコールは、最高の\ @ Transactionalメソッドが完了するまでイベントを保持するということです。 – adam
サムBrannenのソリューションがほとんどで動作しますアダムのコメントについて。
実際には、@TransactionalEventListener
と注釈されたメソッドは、テストメソッドのトランザクションがコミットされた後に呼び出されます。これは、イベントを発生させる呼び出しメソッドが、物理トランザクションではなく論理トランザクション内で実行されているためです。
代わりに、新しい物理トランザクション内で呼び出しメソッドが実行されると、@TransactionalEventListener
で注釈が付けられたメソッドが適切なタイミングで、つまりテストメソッドのトランザクションがコミットされる前に呼び出されます。
また、これらのトランザクションについて実際には気にしないので、テストメソッドには@Commit
は必要ありません。しかし、呼び出しメソッドのコミットされた変更を取り消すには、Sam Brannenが説明した@Sql(...)
ステートメントが必要です。
下記の小さな例を参照してください。トランザクションがコミットされたとき(@TransactionalEventListener
のデフォルトの動作)と呼ばれているリスナー
まず:
@Component
public class MyListener {
@TransactionalEventListener
public void when(MyEvent event) {
...
}
}
はその後、イベントを発行したアプリケーションサービスは、上記のクラスでに耳を傾け。(詳細については
Spring Framework docを参照)トランザクションがメソッドが呼び出されるたびに新しい物理的なものであるように構成されていることに注意してください:
@Service
@Transactional(propagation = Propagation.REQUIRES_NEW)
public class MyApplicationService {
public void doSomething() {
// ...
// publishes an instance of MyEvent
// ...
}
}
最後試験方法サムBrannenによってではなく、@Commit
注釈なしに提案されているようにこの時点で、必要に応じて:あなたは、あなたのテストを使用するトランザクションをロールバックし、コードの確認特定の作品を作りたい場合は
@Transactional
@Sql(scripts = "/cleanup.sql", executionPhase = AFTER_TEST_METHOD,
config = @SqlConfig(transactionMode = TransactionMode.ISOLATED))
@Test
public void test() {
MyApplicationService target = // ...
target.doSomething();
// the event is now received by MyListener
// assertions on the side effects of MyListener
// ...
}
それは
- 1. COMMIT/ROLLBACKとROLLBACKのパフォーマンスをSAVEPOINTにバッチする
- 2. Liquibase Auto Rollback
- 3. after_saveコールバックでfalseとrollbackを返す
- 4. TSQL:トリガ/ ROLLBACK TRANSACTIONのエラー
- 5. MySQL:START TRANSACTION - UPDATE - ROLLBACK:非トランザクションテーブル
- 6. WebサービスでのOracle Transaction Rollback
- 7. Raise ActiveRecord :: Rollbackを使用したリダイレクト?
- 8. MySQLトリガーでROLLBACKを実行することはできますか?
- 9. TRAN&ROLLBACKを印刷プレビューに使用できますか?
- 10. Sql Server 2008R2でトランザクションをROLLBACKできません。
- 11. 壊れたルールでNHibernate Rollback(検証のベストプラクティス)
- 12. 非オブジェクトのrollback()メンバ関数への呼び出し
- 13. カスタム必要なテストとテスト
- 14. Boost ::テストとモッキングフレームワーク
- 15. リファクタリングとテスト
- 16. IntellijとHybrisテスト
- 17. Rails rspecコントローラのテストとインテグレーションのテスト
- 18. Mavenのテスト/ resourcesディレクトリと統合テスト
- 19. ASUTIME LIMITがDB2ストアドプロシージャで満たされると、プロセスROLLBACKまたはCOMMITは実行されますか?
- 20. Java:セマンティクスが変更されていない場合、vs rollbackと何も関係ない?
- 21. ROLLBACKのSQLクエリーにはどのような種類のエラーがありますか?たとえば
- 22. ROLLBACKコマンドの効果をOracle 9iで見ることができない簡単なシナリオ
- 23. モカのテストとフィクスチャ
- 24. ユニットと統合テスト
- 25. キーダウンイベントとキーアップイベントのテスト
- 26. 承認テストとPDF
- 27. リモートコンパイルとテストのベストプラクティス?
- 28. Ext.jsのテストとドキュメント?
- 29. テストのコマンドとイベント
- 30. jQuery.live()とキュウリのテスト
:-)魔法のように動作します。この方法でコミット時に呼び出されます、あなたは恥ずかしがり屋別の方法でテストしてください。私はおそらくあなた自身のコードではなく、フレームワークをテストしていると主張したいと思います。 –
私は同意するかどうかわかりませんが、私はそれを考えます。 @Rollbackは、初期テスト状態に戻るようにデータベースをリセットすることです(テストが相互に作用する可能性が低いことを確認するため)。 – adam
私はそれが何をしているか知っています。問題は、トランザクションがコミットしたというイベントを取得するよう求めていることです。それはありません。 –