すべて(JPA + Hibernateを介して)データベースにアクセスするユニットテストを記述するためには、それらを並列に実行できるようにするために何を知っておく必要がありますか?我々は、単一のスレッドで実行されているときに発生しないmavens並列ユニットテスト機能と経験テストの失敗を使用し始めました。並列で実行できるJPAに対してjunitテストを書くには?
ここで私たちがテストをどのように書いているかの簡単な例を挙げます。 EntityManager
とその他のクラスを@Before
に設定し、トランザクションを開始し、最終的にクラス内のすべてのテストに必要なテストデータを挿入します(テスト固有のデータがテストで作成されます)。 @After
テストが実行されると、すべてのメンバ変数のTransaction.rollback();
とnull
を呼び出すことですべてをロールバックします。 すべての単体テストをメモリ内のhsqldbに対して実行します。
public class TestLogEntryDAO {
private EntityManager em;
private LogEntryDAO dao;
@Before
public void before() {
em = Persistence.createEntityManagerFactory("junit")
.createEntityManager();
dao = new DAOFactory<LogEntryDAO>(LogEntryDAO.class).newInstance(em,
Mockito.mock(ILogger.class));
em.getTransaction().begin();
RecordDAO recordDAO = new DAOFactory<RecordDAO>(RecordDAO.class)
.newInstance(em, Mockito.mock(ILogger.class));
recordDAO.setLogEntryDAO(dao);
createTestData(); // Is this ok?
}
@After
public void after() {
em.getTransaction().rollback();
em = null;
dao = null;
}
@Test
public void testSomething() {
// ...
}
}
ありがとうございます!
それぞれの 'EntityManager'を' ThreadLocal'に格納して、エンティティマネージャのインスタンスをオーバーライドしたくないときにオーバーライドしないようにしてください。 – Jeremy