DbUnit이 테스트 케이스에서 제대로 작동하기 위해 Hibernate 트랜잭션 내에서 변경된 사항을 데이터베이스로 푸시하는 데 문제가 있습니다. DbUnit은 트랜잭션이 끝날 때 커밋되지 않았기 때문에 Hibernate가 변경 한 사항을 보지 못하고있는 것 같습니다. 그리고 이것을 작동시키기 위해 테스트 케이스를 어떻게 재구성해야할지 모르겠습니다.DbUnit에서 최대 절전 모드 트랜잭션 사용하기
여기 내 문제를 보여주기 위해 내 이상 - 단순화 된 테스트 케이스의 : - DbUnit을 사용에
@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);
}
}
내 모든 생각은에 - 여러 테이블에 데이터를 저장
- 전화
someService.save(...)
. - XML에서 예상 테이블을 가져 오려면 DbUnit을 사용하십시오.
- 데이터베이스에서 실제 테이블을 가져 오려면 DbUnit을 사용하십시오.
- Do
Assertion.assertEquals(expectedTable, actualTable);
.
그러나이 시점에서 나는 트랜잭션 내에서 Hibernate에 의해 만들어진 변경 사항을 DbUnit에 표시 할 수 없습니다.
DbUnit이 Hibernate 트랜잭션으로 잘 작동하도록 어떻게 변경해야합니까?
감사합니다.
+1 좋은 답변 Tomasz! – Nilesh