मुझे अपने परीक्षण मामले में ठीक से काम करने के लिए डीबीयूनीट के डेटाबेस में एक हाइबरनेट लेनदेन के भीतर किए गए परिवर्तनों को धक्का देने की कोशिश कर रहा है। ऐसा लगता है कि डीबीयूनीट हाइबरनेट द्वारा किए गए परिवर्तनों को नहीं देख रहा है क्योंकि वे अभी तक लेनदेन के अंत में प्रतिबद्ध नहीं हैं ... और मुझे यकीन नहीं है कि यह काम करने के लिए मेरे टेस्ट केस को पुन: व्यवस्थित कैसे किया जाए।हाइबरनेट लेनदेन के साथ काम करने के लिए डीबीयूनीट प्राप्त करना
यहाँ मेरी समस्या का प्रदर्शन करने के लिए अपने अति सरल परीक्षण का मामला है: -
@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(...)
कि कई तालिकाओं में डेटा बचाता है। - XML से अपेक्षित तालिका प्राप्त करने के लिए डीबीयूनीट का उपयोग करें।
- डेटाबेस से वास्तविक तालिका प्राप्त करने के लिए DbUnit का उपयोग करें।
Assertion.assertEquals(expectedTable, actualTable);
करें।
लेकिन, इस बिंदु पर, मैं लेनदेन के भीतर हाइबरनेट द्वारा किए गए परिवर्तनों को देखने के लिए डीबीयूनीट प्राप्त नहीं कर पा रहा हूं।
डीबीयूनीट को हाइबरनेट लेनदेन के साथ अच्छी तरह से काम करने के लिए मुझे कैसे बदलना चाहिए?
धन्यवाद।
+1 अच्छा जवाब टॉमसज़! – Nilesh