2012-02-06 17 views
0

本質的に、@ Beforeメソッドでエンティティを作成するJUnitテストについての質問ですが、実際のテストメソッドではそれを見つけることはできません。私は何が起こっているのかを調べようとしてきました。どんな種類の助けも本当に感謝しています。テスト:エンティティが作成されましたがデータベースに見つかりません

基本的に、それはこのようなJUnitのクラスです:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"myConfiFile.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class DummyTest { 

@Before 
public void setUp() { 
    // Create an entity here and call .save() 
} 

@Test 
public void testCountMsisdnNumberPlans() { 
    int howManyInstances = dao.countInstancesOfEntity(); 
} 
} 

DAOコードは非常に簡単です:セットアップで

@Transactional(readOnly = true) 
public Integer countInstancesOfEntity(Integer idhlr) { 
   return ((BigDecimal) em.createNativeQuery("SELECT COUNT(*) FROM ENTITY") 
     .getSingleResult()).intValue(); 
} 

()私たちは、一方のエンティティを作成するが、DAOコードは、0を返し続けます。すべてのコメントは本当に素晴らしいでしょう。

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

答えて

2

SpringJUnit4ClassRunner@Before@Afterをテストメソッドと同じトランザクション内で実行します。したがって、@Beforeの永続コンテキストで行われた変更は、テストメソッドを実行する前にデータベースにフラッシュされません。トランザクションが読み取り専用として構成されているため、クエリを実行する前の暗黙的なフラッシュも発生しません。

だから、あなたはいくつかのオプションがあります:

  • readOnly = trueを削除し、それが@Beforeに明示的なflush()を追加クエリ
  • を実行する前に、自動フラッシュを有効にする必要があり、それは、トランザクションのみ
  • を読まされている場合でもフラッシュを強制すべきです
  • @Beforeの代わりに@BeforeTransactionを使用してください。このメソッドはトランザクション外で実行されるため、defaultRollback設定の影響を受けず、手動トランザクション管理が必要です。
+0

完全に正しい。ご協力ありがとうございました。 – Juan

0

defaultRollback = trueのためだと思います。

トランザクションは個々のメソッド呼び出しにラップされます。この場合、setUpとテストは別々のトランザクションにあります。

これをfalseに変更したり、削除してみてください。

関連する問題