ゴール
DAO の create メソッドをテストするために、インスタンスを作成してデータベースに挿入し、エンティティ マネージャーをフラッシュしてデータベースを更新し、dbunit を使用してデータセットを使用してテーブルを比較します。
コード
コードは次のとおりです。Spring テスト、DBUnit、および JPA (Hibernate 経由) を使用します。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/WEB-INF/applicationContext-database.xml"})
public class MyEntityTest extends AbstractTransactionalJUnit4SpringContextTests {
@PersistenceContext
protected EntityManager em;
@Autowired
MyEntityDAO myEntityDAO;
@Test
public void createTest() {
// create the entity
MyEntity record = new MyEntity();
record.setData("test");
myEntityDAO.insertNew(record);
// flush to update the database
em.flush();
// get actual dataset from the connection
Session session = em.unwrap(Session.class);
Connection conn = SessionFactoryUtils.getDataSource(
session.getSessionFactory()).getConnection();
DatabaseConnection connection = new DatabaseConnection(conn);
ITable actualTable = connection.createTable("MY_ENTITY");
// get expected dataset
IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass().getResource("dataset.xml"));
ITable expectedTable = expectedDataSet.getTable("MY_ENTITY");
// compare the dataset
Assertion.assertEquals(expectedTable, actualTable);
}
}
問題
このコードは決して終了せず、このコマンドの実行中にフリーズ (無限ループ ?) するようです:
ITable actualTable = connection.createTable("MY_ENTITY");
しかし、ブロックにコメントするem.flush()
と、テストは終了します (フリーズや無限ループは発生しません)。この場合、挿入後にデータベースが更新されていないため、テストは失敗します。
質問
dataset.getTable() を呼び出すときにフリーズせずに、同様のアプローチ (データセットを dbunit と比較) を使用して DAO の create メソッドをテストするにはどうすればよいですか?