@Test

2012-09-27 18 views
48

के बाद रोलबैक लेनदेन सबसे पहले, मुझे इसके बारे में स्टैक ओवरफ्लो पर बहुत सारे धागे मिल गए हैं, लेकिन उनमें से कोई भी वास्तव में मेरी मदद नहीं करता है, इसलिए संभवतः डुप्लिकेट प्रश्न पूछने के लिए खेद है।@Test

मैं वसंत-परीक्षण का उपयोग कर JUnit परीक्षण चल रहा हूँ, मेरे कोड दिखता है इस

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {}) 
public class StudentSystemTest { 

    @Autowired 
    private StudentSystem studentSystem; 

    @Before 
    public void initTest() { 
    // set up the database, create basic structure for testing 
    } 

    @Test 
    public void test1() { 
    }  
    ... 
} 

मेरे समस्या की तरह है कि मैं करने के लिए अपने परीक्षण अन्य परीक्षणों को प्रभावित नहीं करना चाहते हैं। तो मैं प्रत्येक परीक्षण के लिए रोलबैक की तरह कुछ बनाना चाहता हूं। मैंने इसके लिए बहुत कुछ खोजा है, लेकिन मुझे अभी तक कुछ भी नहीं मिला है। मैं हाइबरनेट और MySQL का उपयोग कर रहा इस

+0

रोलबैक से आपका क्या मतलब है? डेटाबेस की सफाई? – Gaurav

+3

इसे उसी स्थिति में सेट करना जो 'initTest' –

उत्तर

84

बस अपने परीक्षण के शीर्ष पर @Transactional टिप्पणी जोड़ने:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"testContext.xml"}) 
@Transactional 
public class StudentSystemTest { 

डिफ़ॉल्ट वसंत तक अंत में वापस रोलिंग अपने परीक्षा पद्धति और @Before/@After कॉलबैक आसपास एक नई लेन-देन शुरू कर देंगे। यह डिफ़ॉल्ट रूप से काम करता है, संदर्भ में कुछ लेनदेन प्रबंधक होने के लिए पर्याप्त है।

से: 10.3.5.4 Transaction management (बोल्ड मेरा):

TestContext ढांचे में, लेन-देन TransactionalTestExecutionListener द्वारा प्रबंधित कर रहे हैं। ध्यान दें कि TransactionalTestExecutionListenerडिफ़ॉल्ट द्वारा कॉन्फ़िगर किया गया है, भले ही आप अपनी परीक्षा कक्षा पर @TestExecutionListeners स्पष्ट रूप से घोषित नहीं करते हैं। लेनदेन के लिए समर्थन सक्षम करने के लिए, आपको @ContextConfiguration अर्थशास्त्र द्वारा लोड किए गए एप्लिकेशन संदर्भ में PlatformTransactionManager बीन प्रदान करना होगा। इसके अलावा, आपको अपने परीक्षण के लिए कक्षा या विधि स्तर पर @Transactional घोषित करना होगा।

+0

को निष्पादित करने के बाद था, मैंने पहले यह कोशिश की, और यह अभी भी काम नहीं करता है, शायद ... क्या समस्या यह हो सकती है कि मैंने PlatformTransactionManager को परिभाषित नहीं किया है, कैसे क्या मै वह कर सकता हूं? –

+0

@javo: आप डेटाबेस को कैसे संशोधित कर रहे हैं? यदि आप जेपीए/हाइबरनेट/जेडीबीसी टेम्पलेट/का उपयोग कर रहे हैं ... तो कुछ 'PlatformTransactionManager' होना चाहिए। अन्यथा वसंत आपके लेन-देन और डेटाबेस के बारे में कैसे जानेंगे? –

+0

इस उत्तर में लिंक अब सही नहीं है; सही लिंक के लिए [user2418306 का उत्तर] देखें (http://stackoverflow.com/a/35943700/325900) स्प्रिंग दस्तावेज़ से अधिक संदर्भ। – DaveyDaveDave

0

आप एक स्प्रिंट संदर्भ और लेन-देन प्रबंधक, उदा अपने परीक्षण चलाने की आवश्यकता के लिए,

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/your-applicationContext.xml"}) 
@TransactionConfiguration(transactionManager="txMgr") 
public class StudentSystemTest { 

    @Test 
    public void testTransactionalService() { 
     // test transactional service 
    } 

    @Test 
    @Transactional 
    public void testNonTransactionalService() { 
     // test non-transactional service 
    } 
} 

देखें अधिक जानकारी के लिए स्प्रिंग संदर्भ के अध्याय 10. Testing

8

जवाब @Transactional जोड़ने का उल्लेख सही हैं, लेकिन सादगी के लिए आप बस अपने परीक्षण वर्ग extends AbstractTransactionalJUnit4SpringContextTests हो सकता था।

+0

के लिए इसे कक्षा स्तर पर एनोटेशन '@ ट्रांसेक्शनल' जोड़ना काम नहीं करता है, प्रत्येक कार्य कार्यों के लिए अलग-अलग '@ ट्रांसेक्शनल' जोड़ना और सार तत्व ट्रांज़ेक्शनल जेयूनीट 4SpringContextTests भी काम करता है – user3871754

-5

आप रॉलबैक निष्क्रिय कर सकते हैं:

@TransactionConfiguration(defaultRollback = false) 

उदाहरण:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration(defaultRollback = false) 
public class Test { 
    @PersistenceContext 
    private EntityManager em; 

    @org.junit.Test 
    public void menge() { 
     PersistentObject object = new PersistentObject(); 
     em.persist(object); 
     em.flush(); 
    } 
} 
+3

यह ठीक है कि ओपी –

2

मुझे पता है, मैं tooooo एक जवाब पोस्ट करने के लिए देर हो चुकी है, लेकिन उम्मीद है कि यह किसी की मदद कर सकते हैं। इसके अलावा, मैंने अपने परीक्षणों के साथ इस मुद्दे को हल किया है।

मेरा परीक्षण वर्ग

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "path-to-context" }) 
@Transactional 
public class MyIntegrationTest 

प्रसंग एक्सएमएल

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

मैं अभी भी समस्या यह है कि, डेटाबेस स्वचालित रूप से साफ नहीं किया जा रहा था था: यह क्या मैं अपने परीक्षण में पड़ा है।जब मैं

<property name="defaultAutoCommit" value="false" /> 

आशा है कि यह मदद करता है BasicDataSource

के लिए निम्न संपत्ति जोड़ा

समस्या का समाधान हो गया था।

+0

के लिए क्या पूछ रहा है ठीक है, तो आप अपने कथन मैन्युअल रूप से करते हैं? क्या आप सुनिश्चित हैं कि आपका डेटा आपके डेटाबेस में भी लिखा गया था? –

11

एक तरफ: Tomasz Nurkiewicz के जवाब में संशोधन करने का प्रयास को अस्वीकार कर दिया गया था:

यह संपादन खोजने के लिए पद भी एक छोटा सा पढ़ने में आसान, आसान, और अधिक सटीक या अधिक सुलभ नहीं पड़ता है। परिवर्तन या तो पूरी तरह से अनावश्यक या सक्रिय रूप से पठनीयता को नुकसान पहुंचाते हैं।


सही और एकीकरण परीक्षण के बारे में दस्तावेज़ के प्रासंगिक अनुभाग के लिए स्थायी link

लेनदेन के लिए समर्थन को सक्षम करने के लिए, आप ApplicationContext में एक PlatformTransactionManager सेम @ContextConfiguration अर्थ विज्ञान के माध्यम से भरी हुई है कि कॉन्फ़िगर करना होगा।

 
@Configuration 
@PropertySource("application.properties") 
public class Persistence { 
    @Autowired 
    Environment env; 

    @Bean 
    DataSource dataSource() { 
     return new DriverManagerDataSource(
       env.getProperty("datasource.url"), 
       env.getProperty("datasource.user"), 
       env.getProperty("datasource.password") 
     ); 
    } 

    @Bean 
    PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 
} 

इसके अलावा, आप या तो अपने परीक्षण के लिए वर्ग या विधि स्तर पर वसंत के @Transactional एनोटेशन घोषित करना चाहिए।

 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Persistence.class, SomeRepository.class}) 
@Transactional 
public class SomeRepositoryTest { ... } 

@Transactional के साथ एक परीक्षण विधि टिप्पणी करना का कारण बनता है परीक्षण एक सौदे कि डिफ़ॉल्ट रूप से, स्वचालित रूप से परीक्षण पूरा होने के बाद वापस लुढ़का भीतर चलाने के लिए। यदि एक टेस्ट क्लास @Transactional के साथ एनोटेटेड है, तो उस श्रेणी पदानुक्रम के भीतर प्रत्येक टेस्ट विधि लेनदेन के भीतर चल जाएगी।

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