2011-06-14 7 views
5

मैं अपने दाओ परत के लिए एक जूनिट टेस्ट केस स्थापित करने का प्रयास करता हूं। हालांकि, मैं नहीं चाहता हूं कि टेस्ट डेटा वास्तव में डीबी पर बने रहें।@ ट्रान्सएक्शनल स्प्रिंग जूनिट परीक्षण रोलबैक नहीं कर रहा है

तो मैंने सोचा कि मुझे इसे प्रत्येक परीक्षण के बाद लेनदेन और रोलबैक करना चाहिए। यह मैं निम्नलिखित डेटा स्रोत सेटअप के साथ छोड़ देता है:

<bean id="dataSource" 
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
    p:driverClass="org.postgresql.Driver" 
    p:jdbcUrl="jdbc:postgresql://***" 
    p:user="***" 
    p:password="***/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
     p:dataSource-ref="dataSource" 
     p:packagesToScan="***" 
     p:hibernateProperties-ref="hibernateProps" /> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
     p:dataSource-ref="dataSource" 
     p:sessionFactory-ref="sessionFactory"/> 

होने वाली जांच की दाव वर्ग की स्थापना की है इस प्रकार है:

@Repository 
@Transactional 
@SuppressWarnings("unchecked") 
public class BallotBoxRepositoryHibernateImpl implements BallotBoxRepository { 

@Autowired 
private SessionFactory sessionFactory; 

    @Override 
    public void saveVote(DaoObject v) { 
    Session sess = sessionFactory.openSession(); 
    sess.beginTransaction(); 
    sess.save(v); 
    sess.getTransaction().commit(); 
    sess.close(); 
    } 
[...] 
} 

वास्तविक निरंतर आ रही है नौकरी काम अच्छी तरह से करता है। हालांकि, इरादा रोलबैक बनाया कभी नहीं किया गया है:

INFO main transaction.TransactionalTestExecutionListener:292 - Rolled back transaction after test execution for test context [...] 

TransactionalTextExecutionListener परिभाषित किया गया है इस प्रकार है:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"}) 
@TestExecutionListeners({WebTestExecutionerListener.class, DependencyInjectionTestExecutionListener.class, 
TransactionalTestExecutionListener.class}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class DaoTest { ... } 

मैं अपने दाव तरीकों का उपयोग करने में एक autowired सदस्य उपयोग कर रहा हूँ:

@Autowired 
private BallotBoxRepository repo; 

टीएल; डीआर

जुनीट टेस्ट केस परीक्षण डेटा जारी रखता है भले ही यह कह रहा है कि रोलबैक किया गया है।

+0

1. मैनुअल लेन-देन का उपयोग नहीं करते हैंडलिंग, स्प्रिंग 2 का उपयोग करें। @ रोलबैक एनोटेशन की जांच करें। – abalogh

उत्तर

6

आपके मामले में वसंत-आधारित लेनदेन प्रबंधन काम नहीं करता है क्योंकि आप मैन्युअल रूप से हाइबरनेट लेनदेन प्रबंधित करते हैं।

आदेश स्प्रिंग से प्रबंधित लेनदेन का उपयोग करने के लिए आपको निम्न करना चाहिए:

@Override 
public void saveVote(DaoObject v) { 
    sessionFactory.getCurrentSession().save(v); 
} 

भी देखें:

+0

प्रिय भगवान - वह समाधान आसान था। लिंक के लिए धन्यवाद! – chzbrgla

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