5

各作業単位が独自のトランザクションで実行されているのか、単一のグローバルトランザクションの一部として実行されているのかを確認できるようにしたいと思います。

次の形式のメソッド(springとhibernateを使用して定義)があります。

private void updateUser() {
    updateSomething();
    updateSomethingElse();
}

これは、ユーザーがログインしたときのWebサイトと、毎日実行されるバッチジョブの2つの場所から呼び出されます。Webサーバーのコンテキストでは、Webサーバーによって作成されたトランザクションで実行されます。バッチジョブの場合、ユーザーごとに1つのトランザクションが必要です。これにより、このメソッド中に何かが失敗した場合、トランザクションがロールバックされます。したがって、2つの方法があります。

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateUserCreateNewTransaction() {
    updateUser();
}

@Transactional(propagation=Propagation.REQUIRED)
public void updateUserWithExistingTransaction() {
    updateUser();
}

updateUserCreateNewTransaction()はバッチジョブから呼び出され、updateUserWithExistingTransaction()はWebサーバーコンテキストから呼び出されます。

これは機能します。ただし、(バッチの)この動作を変更しないことが非常に重要であるため、この動作をテストするテストを作成したいと思います。可能であれば、コードを変更せずにこれを実行したいと思います。

したがって、私が利用できるオプションのいくつかは次のとおりです。

  1. バッチジョブの実行中にデータベースで開かれたトランザクションをカウントします。

  2. updateSomethingElse()メソッドで、少なくとも1つのユーザー更新が失敗するようにデータを微妙に変更し、そのユーザーのupdateSomething()が実行されていないことを確認します。

  3. コードレビュー。

1はデータベースに非常に依存する方法ですが、休止状態がトランザクションを作成しないことをどのように保証しますか?2の方が良いようですが、設定は非常に複雑です。3は、リリースごとに1つ実行する必要があるため、実際には実用的ではありません。

それで、誰かが私がこのコードを、できればシステムテストまたは統合テストを通してテストすることを可能にする方法を持っていますか?

4

2 に答える 2

2

インメモリ HSQLDB と EasyMock (またはその他のモック フレームワーク) を使用して、単体テスト ハーネスでテストをセットアップしようとします。

次に、updateSomething()メソッドを実際に HSQL データベースに書き込みますが、モック フレームワークを使用してメソッドをモックし、そのメソッドから をupdateSomethingElse()スローしRuntimeExceptionます。それが完了したら、HSQLDB に対してクエリを実行して、updateSomething()内容がロールバックされたことを確認できます。

HSQLDB とトランザクション マネージャーをセットアップするには配管が必要ですが、それが完了すると、いつでも再実行できる外部依存関係のないテストができます。

于 2010-10-26T12:09:46.320 に答える
0

他にできることは、Hibernate のトランザクションのログ出力を構成することです。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

org.hibernate.transaction の log4j カテゴリをトレース ログ レベルで作成すると、ユニット テスト中に Hibernate がトランザクションに関して行うすべてのことがわかるはずです。

于 2011-09-20T14:28:28.067 に答える