2009-08-11 16 views
0

準備されたIn-Memory Databaseなしで、私のデータベースをテストする正しい方法がわかりません。私はJUnit4のためのTestSuiteを持っています。ユニットテストPersistenceLayer(JPA/EclipseLink)

アプリケーションはEclipse RCPとして動作し、コンテナではなく、Springも使用されていないため、JpaManagerは無視されているので、EntityManagerリファレンスを注入して手動で処理する必要がありません。私は、実際のデータベース上で実行していますので

public class CustomerJpaTest { 

    private Customer testCustomer; 

    @Before 
    public void setUp() throws Exception { 
     JpaManager.getInstance().begin(); 
     // create a new user for testing 
     CustomerJpaDao dao = new CustomerJpaDao(); 
     testCustomer = new Customer(); 
     testCustomer.setName("Someone"); 
     dao.persist(testCustomer); 
     JpaManager.getInstance().commit(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     // remove previously created user 
     CustomerJpaDao dao = new CustomerJpaDao(); 
     dao.remove(testCustomer); 
     JpaManager.getInstance().commit(); 
     JpaManager.getInstance().dispose(); 
    } 

    @Test 
    public void testCustomerSaving() throws Exception { 
     // not sure yet 
    } 

    @Test 
    public void testCustomerLoading() throws Exception { 
     ICustomerDao dao = new CustomerJpaDao(); 
     Customer customer = dao.findByName("Someone"); 
     assertEquals("Someone", customer.getName()); 
    } 
} 

、私は、セットアップの方法でテストして行われているテスト(複数可)の後にそれを削除しようと思って、私のオブジェクトを作成しています。 正確にここに私の問題があります:このsetUpとtearDownは実際には何らかのテスト(testCustomerSaving、testCustomerDelete)でもあるかもしれませんが、特定の順序でテストを実行すると、隔離されません同様に削除してから削除してください)。

これを行う正しい方法は何ですか?

答えて

2

setUpにトランザクションを開始し、トランザクションをtearDownにロールバックします。

+0

これは実際に始まりで起こっていることであり、処分されます。しかし、私は実際にテストでdbからロードできるようにストアした後にコミットを行っているので、ロールバックはオブジェクトを削除していません。おそらくこれは間違った方法です。違いがないと仮定して、オブジェクトがJPAキャッシュからロードされただけであればテストで十分でしょうか? – lostiniceland

+1

次に、コーナーをカットすることはできません。テストメソッドでは、実際のユースケース/ユーザーストーリーで発生する順序で呼び出しを行います。 –

+0

同じトランザクション内でクエリの永続データを参照するためにコミットする必要はありません。挿入を強制的に実行するにはflush()が必要です。それ以降の選択では、同じ基本接続を使用している限り、そのデータが表示されます。 – wrschneider