Заставляем DbUnit работать с транзакцией гибернации

У меня проблема с попыткой передать изменения, сделанные в транзакции Hibernate, в базу данных, чтобы DbUnit работал правильно в моем тестовом примере. Похоже, что DbUnit не видит изменений, внесенных Hibernate, потому что они еще не зафиксированы в конце транзакции ... и я не уверен, как реструктурировать мой тестовый пример, чтобы это работало.

Вот мой чрезмерно упрощенный тестовый пример, демонстрирующий мою проблему: -

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:applicationContext-test.xml"
})
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public class SomeTest {
    @Autowired
    protected DataSource dataSource;

    @Autowired
    private SessionFactory sessionFactory;

    @Test
    public void testThis() throws Exception {
        Session session = sessionFactory.getCurrentSession();

        assertEquals("initial overlayType count", 4, session.createQuery("from OverlayType").list().size());

        //-----------
        // Imagine this block is an API call, ex: someService.save("AAA");
        // But for the sake of simplicity, I do it this way
        OverlayType overlayType = new OverlayType();
        overlayType.setName("AAA");
        session.save(overlayType);
        //-----------

        // flush has no effect here
        session.flush();

        assertEquals("new overlayType count", 5, session.createQuery("from OverlayType").list().size());

        // pull the data from database using dbunit
        IDatabaseConnection connection = new DatabaseConnection(dataSource.getConnection());
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("resultSet", "select * from overlayType");
        ITable actualTable = partialDataSet.getTable("resultSet");

        // FAIL: Actual row count is 4 instead of 5
        assertEquals("dbunit's overlayType count", 5, actualTable.getRowCount());

        DataSourceUtils.releaseConnection(connection.getConnection(), dataSource);
    }
}

Вся моя идея использования DbUnit заключается в следующем: -

  • Вызов someService.save (...) , который сохраняет данные на несколько таблиц.
  • Используйте DbUnit, чтобы получить ожидаемую таблицу из XML.
  • Используйте DbUnit для получения реальной таблицы из базы данных.
  • Выполните Assertion.assertEquals (expectedTable, actualTable); .

Но на данный момент я не могу заставить DbUnit видеть изменения, сделанные Hibernate в транзакции.

Как мне изменить, чтобы DbUnit нормально работал с транзакцией Hibernate?

Спасибо.

6
задан limc 21 December 2011 в 14:34
поделиться