テスト:エンティティが作成されましたがデータベースに見つかりません

基本的には、@ 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();
}

setUp()では1つのエンティティを作成しますが、DAOコードは0を返し続けます。コメントは本当に素晴らしいものです。

ありがとう。

0

2 答え

SpringJUnit4ClassRunner executes @Before and @After inside the same transaction as the test method. Thus, changes made in persistence context in @Before are not flushed to the database before running the test method. Implicit flush before executing a query doesn't happen as well, because transaction is configured as read only.

だから、いくつかの選択肢があります:

  • readOnly = true を削除すると、クエリを実行する前に自動フラッシュが有効になります。
  • @Before に明示的な flush()を追加すると、トランザクションが読み込み専用であっても強制的にフラッシュされます。
  • @Before の代わりに @BeforeTransaction を使用します。このメソッドはトランザクション外で実行されるため、 defaultRollback の設定に影響されないため、手動トランザクション管理が必要です。
2
追加された
完全に正しい。ご協力ありがとうございました。
追加された 著者 Juan,

あなたがdefaultRollback = trueを持っているからだと思います。

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

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

0
追加された