2010-11-12 13 views
34

मुझे अपने डीएओ और सेवाओं का परीक्षण करने में कोई समस्या नहीं है, लेकिन जब मैं INSERT एस या UPDATE एस का परीक्षण करता हूं तो मैं लेनदेन को रोलबैक करना चाहता हूं और अपना डेटाबेस प्रभावित नहीं करना चाहता हूं।जुनीट में वसंत के साथ सेवाओं का परीक्षण करते समय डेटाबेस लेनदेन को कैसे रोलबैक करें?

मैं लेनदेन प्रबंधित करने के लिए अपनी सेवाओं के अंदर @Transactional का उपयोग कर रहा हूं। मैं जानना चाहता हूं, क्या यह जानना संभव है कि कोई लेनदेन ठीक होगा, लेकिन डेटाबेस को बदलने से रोकने के लिए इसे रोलबैक करें?

यह मेरा टेस्ट है:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:/META-INF/spring.cfg.xml") 
@TransactionConfiguration(defaultRollback=true) 
public class MyServiceTest extends AbstractJUnit38SpringContextTests { 
    @Autowired 
    private MyService myService; 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 

    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 

    @Test 
    public void testInsert(){ 
     long id = myService.addPerson("JUNIT"); 
     assertNotNull(id); 
     if(id < 1){ 
      fail(); 
     } 
    } 
} 

समस्या यह है कि इस परीक्षण असफल हो जायेगी क्योंकि लेनदेन rollbacked किया गया था, लेकिन डालने ठीक है! यदि मैं @TransactionConfiguration(defaultRollback=true) हटा देता हूं तो परीक्षा पास हो जाती है लेकिन डेटाबेस में एक नया रिकॉर्ड डाला जाएगा।

@Test 
@Transactional 
@Rollback(true) 
public void testInsert(){ 
    long id = myService.addPerson("JUNIT"); 
assertNotNull(id); 
if(id < 1){ 
     fail(); 
    } 
} 

अब सही तरीके से परीक्षा का परीक्षण कर सकते हैं, लेकिन रोलबैक को अनदेखा कर दिया गया है और रिकॉर्ड डेटाबेस में डाला गया है। मैंने स्पष्ट रूप से @Transactional के साथ myService के अंदर विधि addPerson() को एनोटेट किया है। रोलबैक को अनदेखा क्यों किया जा रहा है?

+0

अच्छा प्रश्न +1 :-) –

उत्तर

28

आप अपने परीक्षा पद्धति की सीमाओं के लेन-देन सीमाओं का विस्तार करने की जरूरत पर

AbstractTransactionalJUnit38SpringContextTests को देखने के लिए चाहते हो सकता है। आप @Transactional के रूप में अपने परीक्षण विधि (या पूरे परीक्षण वर्ग) व्याख्या से यह कर सकते हैं:

@Autowired SessionFactory sf; 

@Test 
@Transactional 
public void testInsert(){ 
    myService.addPerson("JUNIT"); 
    sf.getCurrentSession().flush(); 
    sf.getCurrentSession().doWork(... check database state ...); 
} 
+0

हाय अनदेखा किया गया है, अब परीक्षण पास है, लेकिन रोलबैक को नजरअंदाज कर दिया गया था। मेरे पास "testAddPerson" और "addPerson" से अधिक @ ट्रांसेक्शनल है। – blow

+0

यदि मैं अपने सेवा से @ ट्रांसेक्शनल को हटा देता हूं, तो परीक्षण के लिए कोई सक्रिय लेनदेन नहीं है, इसलिए मुझे लगता है कि "testAddPerson" पर ट्रांज़ेक्शनल काम नहीं करता है ... – blow

+5

@blow: मैंने अभी देखा है कि आपने 'सार JUnit38SpringContextTests' बढ़ाया है। इसकी आवश्यकता नहीं है क्योंकि आपके पास '@ रनविथ' के साथ जुनीट 4 टेस्ट है। – axtavt

2

जांच

http://static.springsource.org/spring/docs/2.5.x/reference/testing.html

खंड 8.3.4 विशेष

वसंत में परीक्षण है कि एक सौदे में प्रत्येक परीक्षा लपेटो जाएगा, ताकि डीबी नहीं बदला गया है के लिए कुछ वर्गों है। यदि आप चाहें तो आप उस कार्यक्षमता को बदल सकते हैं।

संपादित करें - अपने अधिक infos के आधार पर, आप

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/context/junit38/AbstractTransactionalJUnit38SpringContextTests.html

+0

हाय मेरे पास अधिक जानकारी थी। – blow

+0

@blow - मैंने अपना जवाब अपडेट किया। – hvgotcodes

+0

धन्यवाद, यह उपयोगी है, मुझे अपने कार्यान्वयन में एक छोटी सी समस्या मिली। अब मुझे एक और समस्या है, रोलबैक को – blow

0

हैं:

@Test 
@Transactional 
public void testInsert(){ 
    long id=myService.addPerson("JUNIT"); 
    assertNotNull(id); 
    if(id<1){ 
     fail(); 
    } 
} 

तुम भी है कि डेटा सुनिश्चित करने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं सही ढंग से रोलबैक से पहले लिखा गया था अपने

myService.addPerson("JUNIT"); 

विधि टिप्पणी की जाती है @Transactional है कि आपने कुछ अलग तरह की हो रही होगी या त्रुटियों इसे ठीक करने की कोशिश कर रहा। तो आप बेहतर डीएओ विधियों का परीक्षण करें। कक्षा से पहले एनोटेशन के बाद

1

उपयोग:

@TransactionConfiguration(transactionManager = "txManager",defaultRollback = true) 
@Transactional 
यहाँ txManager

आवेदन संदर्भ के लेन-देन प्रबंधक है।

यहां txManagerapplication context से लेनदेन प्रबंधक का एक उदाहरण या बीन आईडी है।

<!-- Transaction Manager --> 
    <bean id="txManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="txManager" /> 

setUp() विधि के अंदर अपना कोड जोड़ें, इस परीक्षण की शुरुआत और पिछले रैप अप कोड teatDown() विधि है कि पिछले पर मार डाला जाएगा में रखा जाना चाहिए में निष्पादित करेंगे। या आप इसके बजाय @Before और @After एनोटेशन का भी उपयोग कर सकते हैं।

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

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