2

Spring と JUnit を使用して、DAO の統合テストを作成しています。テスト メソッドの最初にテスト データを設定し、その後同じテスト メソッドで DAO メソッドをテストします。問題は、トランザクションをフラッシュ/コミットしないと、EntityManager が、データ設定で作成したばかりのエンティティの同じインスタンスを返すことです。常に合格するため、テストが役に立たなくなります。

例えば

@Test   
@Transactional()
public void loadTreeBasicCase() {
    // creates and saved node to DB
    Node n = createNode();

    // test DAO
    Node result = dao.lookup(n.getId());

    // verify
    assertThat(n, equalTo(result));
}

1 つの方法は、DAO で commit() および/または flush() メソッドを公開することです。しかし、本番コードでは、これが発生する必要はほとんどないため、これを実行しないことをお勧めします (EntityManager に任せてください)。アノテーションまたはSpring構成でこれを構成する方法はありますか? Spring、JPA2、Hibernate を使用しています。

4

1 に答える 1

2

@Transactional に defaultRollback 属性を設定して、テスト間で物事をリセットできます。これはあなたが求めているもののようには聞こえません。最初にそれを捨てるだけです。

テスト内で、エンティティ マネージャーは正しく動作しています。テスト用にさまざまな動作を挿入して、残りのテストからセットアップを「切断」したいと考えています。いくつかのテストで行ったことの 1 つは、エンティティ マネージャーでテストから直接フラッシュを呼び出すことでした。数回しか必要ありませんでしたが、そのような場合には価値がありました。DAO で呼び出したくないメソッドを提供しないように、(DAO ではなく) テストで実行しました。

于 2012-04-15T15:16:44.497 に答える