2011-12-21 10 views
6

मुझे अपने परीक्षण मामले में ठीक से काम करने के लिए डीबीयूनीट के डेटाबेस में एक हाइबरनेट लेनदेन के भीतर किए गए परिवर्तनों को धक्का देने की कोशिश कर रहा है। ऐसा लगता है कि डीबीयूनीट हाइबरनेट द्वारा किए गए परिवर्तनों को नहीं देख रहा है क्योंकि वे अभी तक लेनदेन के अंत में प्रतिबद्ध नहीं हैं ... और मुझे यकीन नहीं है कि यह काम करने के लिए मेरे टेस्ट केस को पुन: व्यवस्थित कैसे किया जाए।हाइबरनेट लेनदेन के साथ काम करने के लिए डीबीयूनीट प्राप्त करना

यहाँ मेरी समस्या का प्रदर्शन करने के लिए अपने अति सरल परीक्षण का मामला है: -

@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); करें।

लेकिन, इस बिंदु पर, मैं लेनदेन के भीतर हाइबरनेट द्वारा किए गए परिवर्तनों को देखने के लिए डीबीयूनीट प्राप्त नहीं कर पा रहा हूं।

डीबीयूनीट को हाइबरनेट लेनदेन के साथ अच्छी तरह से काम करने के लिए मुझे कैसे बदलना चाहिए?

धन्यवाद।

उत्तर

9

मैं DbUnit साथ काम नहीं है, लेकिन यह TransactionAwareDataSourceProxy की तरह लगता है चाल करेंगे। मूल रूप से आप इस प्रॉक्सी के साथ अपने मूल डेटा स्रोत रैप करने के लिए की जरूरत है और, बजाय इसे उपयोग करती हैं इसलिए इस कोड है कि:

new DatabaseConnection(dataSource.getConnection()) 

वास्तव में प्रॉक्सी के माध्यम से चला जाता है और एक ही लेन-देन और हाइबरनेट के रूप में कनेक्शन का उपयोग करता।

मुझे Transaction aware datasource (use dbunit & hibernate in spring) ब्लॉग पोस्ट यह समझा गया।

एक और तरीका लेनदेन परीक्षणों को पूरी तरह से छोड़ना और मैन्युअल रूप से डेटाबेस को साफ करना होगा। मेरी transactional tests considered harmful आर्टिकल देखें।

+0

+1 अच्छा जवाब टॉमसज़! – Nilesh

0

ऐसा लगता है कि टेस्ट केस को दो लेन-देन की आवश्यकता है: डेटा डेटाबेस में डेटा डालने के लिए, और दूसरा इसे पुनर्प्राप्त करने के लिए।

मुझे क्या होता है:

  • तो डेटा जब इकाई परीक्षण समाप्त होता है साफ किया जाता है एक स्मृति डेटाबेस का उपयोग करें।
  • लेनदेन संबंधी टिप्पणियां हटाएं और शुरुआत ट्रांज़ेक्शन का उपयोग करें और सत्र के तरीकों को सीधे करें।

प्रारंभिक overlaytype गिनती 0 होगा, और के बाद सत्र सहेजा जाता है, यह होना चाहिए 1.

संबंधित मुद्दे