20

春のテスト フレームワークを使用して、休止状態セッションの save() メソッドをテストしたいと考えています。@Test メソッドは次のとおりです。

@Test
@Transactional
public void testSave() {
    User expected = createUser();
    getGenericDao().currentSession().save(expected);
    User actual = getUser(generatedId);
    assertUsersEqual(expected,actual);
}

ユーザーをデータベースにフラッシュしたい。このメソッドの後にユーザーをデータベースに入れたい

getGenericDao().currentSession().save(expected);

次に、Spring Data Framework を使用してデータベースに移動し、この保存されたユーザーを次の行で取得します。

User actual = getUser(generatedId);

次のような休止状態のフラッシュメソッドを使用しようとしました:

currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();

ユーザーをデータベースにフラッシュしません! ただし、 @Transactional スプリング アノテーションを使用せず、ユーザーをプログラムによるスプリング トランザクションに保存すると、必要なことが達成されます。残念ながら、スプリング@Transactionalがないため、dbに保存されたユーザーはロールバックされません。したがって、私のテスト メソッドは、後続のテスト メソッドのデータベースと動作を変更します。

したがって、ユーザーをテストメソッド内で(最後ではなく)dbにフラッシュし、テストメソッドの最後ですべての変更をdbにロールバックする必要があります。

次のようにメソッドを準備するためのUPDATE提案:

@Transactional
public void doSave(User user){
    getGenericDao().currentSession().save(user);
}

また、testSave 内で doSave を呼び出しても何も実行されません。このメソッドを実行した後でも、データベースにユーザーがいません。ブレークポイントを設定し、コマンドラインからデータベースをチェックします。

更新返信ありがとうございます。問題は、メソッド flush() がユーザーをデータベースに配置しないことです。Isolation.READ_UNCOMMITTED を試しましたが、ユーザーがデータベースに配置されません。@Test メソッドでスプリング トランザクションをオフにして、プログラムによるトランザクションで保存を行う場合にのみ、必要なことを達成できます。しかし、その後 @Test メソッドはロールバックされず、保存されたユーザーを後続の @Test メソッドに残します。ここで、ユーザーを保存する @Test メソッドは、ロールバックされないため、ユーザーを削除する @Test メソッドほど危険ではありません。したがって、@Testメソッドのトランザクションサポートが必要であり、とにかくユーザーをdbに入れる(または削除する)ことはできません。実際には、@Test メソッドが終了し、@Test メソッドのトランザクションがコミットされた後にのみ、ユーザーが db に配置 (または削除) されます。したがって、 @Test メソッドの途中でユーザーを db に保存し、 @Test メソッドの最後にロールバックしたい

ありがとうございました!

4

4 に答える 4

1

が機能しない場合flushは、データベースの分離レベルに大きく依存します。

Isolationデータベースのプロパティの 1 つで、ACID1 つの操作によって行われた変更が他の同時実行操作にいつどのように表示されるかを定義します。

分離レベルがRead Committedまたはに設定されていると思いますRepeatable Read

于 2013-06-23T19:48:40.357 に答える