Цель
Чтобы протестировать метод создания 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()?