2012-04-12 12 views
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を使用しています。

答えて

2

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

このテストでは、エンティティマネージャが正しく動作しています。テストの残りのテストからセットアップを「切断する」ために、異なる動作を注入する必要があります。私がいくつかのテストで行ったことの1つは、テストからエンティティマネージャに直接フラッシュすることでした。私はそれを数回しなければなりませんでしたが、そのような場合には貴重でした。私はテストで(DAOではなく)DAOで、私が人々に電話したくない方法を提供しないようにしました。

+0

もちろん、私に思い出させることに感謝します。私はDAOを介してエンティティマネージャを使用することに慣れています。私は単にそれを私のテストに配線して直接呼び出すことができないことを忘れていました。 :) – citress