2012-03-22 14 views
16

मैं एक साधारण जुनीट परीक्षण चला रहा हूं जो एक आवेदन डीएओ को फिर से चलाता है। समस्या यह है कि मैं हमेशा मिलता है:जुनीट परीक्षण हमेशा लेनदेन को रोलबैक

javax.persistence.RollbackException: Transaction marked as rollbackOnly 

JUnit परीक्षण है:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
@Transactional 
public class PerformanceTest { 

    @Test 
    @Transactional(propagation= Propagation.REQUIRES_NEW) 
    @Rollback(false) 
    public void testMsisdnCreationPerformance() { 
     // Create a JPA entity 

     // Persist JPA entity 
    } 
} 

आप मैं इस विधि रोलबैक के लिए नहीं स्पष्ट रूप से घोषित करने कर रहा हूँ देख सकते हैं।

क्या वसंत जुनीट समर्थन हमेशा रोलबैक को सही पर सेट करता है?

अग्रिम धन्यवाद,

+0

आपको अपवाद कहां मिल रहा है? क्या आप स्टैकट्रैक पोस्ट कर सकते हैं? – nwinkler

उत्तर

10

यह एक परीक्षण है कि अपने डेटाबेस में परिवर्तन की इच्छा और संशोधन रखने के लिए अजीब है। टेस्ट ऑर्थोगोनल माना जाता है: कोई परीक्षण किसी अन्य पर निर्भर नहीं करता है। इसके अलावा, परीक्षण परीक्षण आदेश से स्वतंत्र होने चाहिए, और यहां तक ​​कि idempotent

तो या तो आप अपने setUp() विधि में डेटा बेस बदलना चाहते हैं और अपने tearDown() विधि में परिवर्तन को रोलबैक करना चाहते हैं, या तो आप परीक्षण के लिए इसमें कुछ अच्छे मानों के साथ एक परीक्षण डेटाबेस सेट करना चाहते हैं।

शायद मुझे यहां कुछ याद आ रहा है लेकिन आमतौर पर आपको यह नहीं चाहिए।

+23

लेकिन यह सवाल नहीं है। – Ralph

+7

@ राल्फ लेकिन यह अभी भी सही जवाब है। –

+6

मुझे वास्तव में एक अच्छा कारण मिला कि एक जूनिट टेस्ट रोलबैक क्यों न करें। तो फिर "सही उत्तर" यह नहीं है कि आपको यह नहीं करना चाहिए। सही उत्तर वह है जो बता सकता है कि कैसे। – user829237

39

यह काम करना चाहिए, जैसा कि आप उम्मीद करते हैं, लेकिन क्या आप परीक्षण के तहत अपनी कक्षा के भीतर एक और लेनदेन खोल सकते हैं या आपके पास कहीं और सुविधा/या बग है।

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} 
@Transactional 
public class PerformanceTest { 

    @Test 
    @Rollback(false) 
    public void testMsisdnCreationPerformance() { 
     // Create a JPA entity 

     // Persist JPA entity 
    } 
} 

@See Spring Reference Chapter 9.3.5.4 Transaction management

+1

+1, लेकिन मुझे अन्य उत्तर –

0

मैं राल्फ का जवाब इस बात से सहमत:

Btw इस एनोटेशन enougth होना चाहिए।

प्रचार। REQUIRES_NEW एक नया लेनदेन बनाता है और यह शायद मुख्य लेनदेन मार्ग से मेल नहीं खाता है जिसमें परीक्षण चल रहा है।

मेरी सरल अनुभव एनोटेशन @Transactional ठीक से व्यवहार संदर्भ में हर एक परीक्षण चलाने चाहिए परिभाषित करने के लिए इस एक के लिए विशिष्ट वर्तमान रोलबैक खंड (के रूप में राल्फ द्वारा दिखाया गया है) सौंपने के काम होगा।

राल्फ का उत्तर उपयोगी है और साथ ही स्निकोलस का जवाब परीक्षण के संदर्भ के प्रबंधन के एक विशेष मामले से संबंधित है। idempotence एकीकरण और स्वचालित परीक्षण के लिए मौलिक है, लेकिन उन्हें लागू करने के विभिन्न तरीकों से होना चाहिए। सवाल यह है कि आपके पास किस तरह के तरीके हैं? औरeseese तरीकों का क्या व्यवहार है?

[...] 
    @Transactional 

    public class Test { 

    @Test 
    @Rollback(false) 
    public void test() { 

    [...] 

सरल, प्रश्न-सुसंगत तरीका :)

6

बस गलत पर एनोटेशन रोलबैक जोड़ सकते हैं और ध्वज सेट है।

@Test 
    @Rollback(false) 
1
आधिकारिक प्रलेखन से

:

डिफ़ॉल्ट रूप से, परीक्षण लेनदेन स्वचालित रूप से परीक्षण के पूरा होने के बाद वापस लुढ़का दिया जाएगा; हालांकि, प्रतिबद्ध और व्यवहार रोलबैक की लेन-देन @Commit और @Rollback एनोटेशन

के माध्यम से एलान के तौर पर विन्यस्त किया जा सकता https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations

@Commit इंगित करता है कि एक लेन-देन संबंधी परीक्षा पद्धति के लिए लेन-देन के बाद किये गये किया जाना चाहिए परीक्षण विधि पूरी हो गई है। @Commit को स्पष्ट रूप से कोड के इरादे को व्यक्त करने के लिए @ रोलबैक (झूठी) के लिए प्रत्यक्ष प्रतिस्थापन के रूप में उपयोग किया जा सकता है।

+0

पसंद है जो मुझे बहुत भ्रमित कर रहा था यह है कि परीक्षण टीसीएन को प्रतिबद्ध करेगा, भले ही अपवाद बुलबुले सभी तरह से हो, जहां सामान्य रूप से (@ व्यापार पर ट्रान्ससेनल क्लास टेस्ट विधि के विपरीत है) जो एक टीएक्सएन रोलबैक ट्रिगर करेगा। –

+0

केवल चेक अपवादों के लिए। अनचेक किया गया वापस स्वचालित हो जाएगा। https://stackoverflow.com/questions/3701376/rollback-on-every-checked-exception-whenever-i-say-transactional – harryssuperman

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