2

ゴール

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 メソッドをテストするにはどうすればよいですか?

4

1 に答える 1

1

解決策を見つけました。問題は接続が原因でした。

私が交換した場合:

Session session = em.unwrap(Session.class);
Connection conn = SessionFactoryUtils.getDataSource(
        session.getSessionFactory()).getConnection();

DataSource ds = (DataSource) applicationContext.getBean("dataSource");
Connection conn = DataSourceUtils.getConnection(ds);

すべて正常に動作します...

理由がよくわからないので、わかる方がいましたらコメントで教えてください。

于 2012-12-28T10:13:44.633 に答える