2012-01-13 11 views
5

का उपयोग करने से पहले @ स्प्रिंगबैक (झूठी) पर काम नहीं कर रहा है, मेरे स्प्रिंग एप्लिकेशन में एक जुनीट टेस्ट में, मैं एक सेटअप विधि में बहुत सारे डेटा डालना चाहता हूं, और फिर इसका परीक्षण करने के लिए इसका उपयोग करता हूं। हालांकि, जो भी @Before विधि से किया जाता है प्रत्येक परीक्षा के बाद वापस लुढ़का हुआ प्रतीत होता है, भले ही मैं @Rollback(false)@ रोलबैक (झूठा) स्प्रिंगजेनिट 4 क्लासरुनर

साथ विधि व्याख्या यहाँ मैं क्या कर रहा हूँ का एक सरलीकृत संस्करण है:

public class TestClass 
{ 
    @Autowired 
    MyService service; 

    @Before 
    public void setup() 
    { 
     if(service.getById(1) == null) 
     { 
     Thing thing = new Thing(); 
     thing.setId(1); 
     service.create(new Thing(1)) 
     } 
    } 
} 

मैंने @BeforeClass का उपयोग करने का भी प्रयास किया है, लेकिन इसके लिए विधि स्थिर होने की आवश्यकता है, और किसी भी @Autowired से पहले निष्पादित करने के लिए सेटर विधियों को बुलाया जाता है, इसलिए @BeforeClass रनों पर मुझे कॉल करने की आवश्यकता वाली सेवाओं तक पहुंच नहीं मिल सकती है।

मैंने @PostConstruct का उपयोग करने का प्रयास किया, लेकिन लेनदेन उपलब्ध कराने के साथ समस्याएं हैं (और मेरा सेटअप ऐसा है कि एक लेनदेन शुरू होने पर ही हाइबरनेट सत्र उपलब्ध होता है)। अजीब तरह से एक सत्र उपलब्ध प्रतीत होता था, लेकिन एक ही सत्र के भीतर से दो ऑब्जेक्ट्स बराबर नहीं थे, जिसका अर्थ है कि हाइबरनेट 1-स्तरीय कैश असफल रहा, या प्रत्येक ऑपरेशन एक अलग सत्र में हो रहा था। @BeforeTransaction एक ही व्यवहार को प्रदर्शित करने लग रहा था।

+0

आपने कक्षा या विधि स्तर पर '@ रोलबैक 'एनोटेशन कहां रखा? – Ralph

+0

@ राल्फ मैंने 'सेटअप()' विधि '@ रोलबैक (झूठी)' पर और फिर कक्षा पर भी कोशिश की है जबकि 'रोलबैक' के साथ परीक्षण विधियों को भी एनोटेट किया है। –

+0

क्या आपको कभी यह हासिल करने का कोई तरीका मिला है? – Arjan

उत्तर

2

वसंत TransactionalTestExecutionListener जूनिट टेस्ट के लेनदेन के प्रबंधन के लिए ज़िम्मेदार है। जूनिट टेस्ट के लिए लेनदेन शुरू करने और समाप्त करने के लिए यह दो विधियों (से पहले टेस्टमेथ और के बाद टेस्टमेथ) का उपयोग करता है।

@Before एनोटेशन इसे इस तरह से काम करने लगता है का सवाल है, यह @Rollback विशेषता @Before एनोटेशन के साथ सेटअप विधि करने के लिए टेस्ट विधि पर निर्दिष्ट लागू होता है

मैं इस प्रक्रिया को समझाने के लिए इस उदाहरण है , मेरे पास दो टेस्ट विधियां हैं (रोल बैक सच्चाई के साथ दूसरे को वापस झूठ बोलें)

 @RunWith(SpringJUnit4ClassRunner.class) 
     @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class}) 
     @Transactional 
     public class MyTest 
     { 

     @Before 
     public void setUp() 
     { 
      //When executing this method setUp 
      //The transaction will be rolled back after rollBackTrue Test 
      //The transaction will not be rolled back after rollBackFalse Test 
     } 


     @Test 
     @Rollback(true) 
     public void rollBackTrue() 
     { 
      Assert.assertTrue(true); 
     } 

     @Test 
     @Rollback(false) 
     public void rollBackFalse() 
     { 
      Assert.assertTrue(true); 
     } 
    } 
+0

हाय प्रसाद। आपके उत्तर के लिए धन्यवाद, लेकिन यह सही नहीं हो सकता है। यदि service.create() लेनदेन का हिस्सा नहीं था, तो डिफ़ॉल्ट रूप से प्रत्येक परीक्षण के बाद इसे वापस क्यों घुमाया जा रहा है? समस्या यह है कि * यह एक लेनदेन के बाहर होना चाहता है, इसलिए यह वापस लुढ़का नहीं जाएगा, लेकिन यह पता नहीं लगा सकता कि कैसे। –

+0

क्षमा करें, मेरे टेस्ट ने मुझे फेंक दिया और मुझे विधि प्रलेखन पढ़ना चाहिए था, मैंने एक उदाहरण के साथ जवाब बदल दिया। –

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