DBUnit, Hibernate/JPA, DAO и сброс

Цель

Чтобы протестировать метод создания DAO, я создаю экземпляр, вставляю его в базу данных, очищаю диспетчер сущностей для обновления базы данных, а затем использую 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(), тест завершится (без зависания или бесконечного цикла). В этом случае тест не пройден, потому что база данных не была обновлена ​​после вставки.


Вопрос

как я могу протестировать метод создания DAO, используя аналогичный подход (сравните набор данных с dbunit) без зависания при вызове dataset.getTable()?


person Jerome Cance    schedule 28.12.2012    source источник


Ответы (1)


Я нашел решение. Проблема возникла из-за соединения.

Если я заменю:

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

by

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

Все работает нормально...

Я не понимаю, почему, поэтому дайте мне знать в комментариях, если у вас есть какие-либо подсказки, которые помогут мне понять это.

person Jerome Cance    schedule 28.12.2012