2017-05-11 3 views
9

मेरे पास एकीकरण परीक्षण है जो इनमेरी डेटाबेस पर शीर्ष पर निष्पादित किया जाता है। प्रत्येक परीक्षा के हस्ताक्षर और अधिक या कम इस तरह दिखता है:@SpringBootTest @Sql के साथ: स्क्रिप्ट निष्पादन और संदर्भ प्रारंभिकरण का आदेश

spring: 
    jpa: 
    hibernate: 
     ddl-auto: create-drop 

मैं उम्मीद एसक्यूएल स्क्रिप्ट के प्रारंभ के बाद निष्पादित किया जाना है:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@Sql("/clean-data-in-all-tables.sql") 
public class SomeTest { 
    @Test 
    public void shouldDoSomehting() {} 
} 

परीक्षण संदर्भ प्रारंभ डीबी स्कीमा हाइबरनेट द्वारा निर्मित है के दौरान संदर्भ और डीबी स्कीमा पीढ़ी के बाद। हालांकि कुछ मामलों में clean-data-in-all-tables.sql स्कीमा पीढ़ी से पहले निष्पादित किया गया है और यह विफल रहता है क्योंकि यह उन तालिकाओं की अपेक्षा करता है जो अभी तक नहीं बनाए गए थे।

मेरे द्वारा समझाए गए तरीके से 500 से अधिक परीक्षण लिखे गए हैं और जब तक मैंने कुछ और समान परीक्षण नहीं जोड़े, तब तक वे सभी अच्छी तरह से काम कर रहे थे।

टेस्ट विफल हो जाते हैं जब मैं उन्हें ग्रैडल या इंटेलिजे के माध्यम से एक साथ निष्पादित करता हूं। ध्यान दें कि असफल परीक्षण ऐसे परीक्षण नहीं हैं जिन्हें हाल ही में जोड़ा गया था। यह पुराने परीक्षण हैं जिन्हें मैंने जोड़ा है उससे पूरी तरह से असंबंधित हैं। यह भी अजीब बात यह है कि विफल परीक्षण परीक्षण अच्छी तरह से काम करते हैं अगर मैं उन्हें IntelliJ के माध्यम से एक चलाता हूं।

यह वसंत-बूट की एक बग की तरह दिखता है हालांकि मैं अभी भी इसे हल करने के लिए एक रास्ता खोजने का प्रयास करता हूं। साथ ही मैंने इस मुद्दे को हल करने के लिए कई चीजों की कोशिश की, हालांकि उनमें से कोई भी सहायक नहीं था।

कृपया अपने विचारों को साझा करें कि क्या मदद कर सकता है और मेरे कोड में क्या गलत हो सकता है।

अद्यतन: मिले वैकल्पिक हल: create करने के लिए create-drop से spring.jpa.hibernate.ddl-auto बदलते समस्या का हल।

लेकिन सवाल अभी भी खुला है इस तरह के अजीब व्यवहार का कारण क्या है?

+0

क्या आपने कोई नई कॉन्फ़िगरेशन जोड़ दी है? SpringBootTest एक परीक्षण रूट से एक प्रोजेक्ट रूट तक कॉन्फ़िगरेशन की तलाश में है। –

+0

नहीं, मैंने कोई नई कॉन्फ़िगरेशन शुरू नहीं की है और मैंने मौजूदा कॉन्फ़िगरेशन को नहीं बदला है। –

उत्तर

2

एक संभव समाधान (मुझे यकीन है कि अगर आप DBUnit प्रयोग करने के लिए खुले हैं नहीं कर रहा हूँ) हो सकता है:

1) बनाएं सार भंडार एकता टेस्ट:

@TestExecutionListeners({DbUnitTestExecutionListener.class}) 
@SpringApplicationConfiguration(classes = Application.class) 
@DirtiesContext 
public abstract class AbstractRepositoryIT extends AbstractTransactionalJUnit4SpringContextTests { 
} 

2) बनाएं "असली" एकीकरण परीक्षण:

@DatabaseSetup(SomeEntityRepositoryIT.DATASET) 
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = {"dataset.xml}) 
public class SomeEntityRepositoryIT extends AbstractRepositoryIT { 
... 
} 

फ़ाइल dataset.xml में आप ऊपर प्रारंभिक अवस्था अपने परीक्षण आदि के लिए सेट कर सकते हैं ... More can be found here

+0

धन्यवाद। दुर्भाग्य से मैं डीबीयूनीट का उपयोग नहीं कर सकता। यह मेरी ज़िम्मेदारी है कि मेरे मौजूदा परीक्षण विन्यास में क्या गलत है। –

+0

हाँ मैं इसे समझता हूं। लेकिन एक और सवाल - एसक्यूएल फ़ाइल को "क्लीन-डेटा-इन-ऑल-टेबल.sql" कहा जाता है - क्या यह केवल परीक्षण के दौरान डेटाबेस में डाले गए सभी डेटा को हटाने (रोलबैक) करने के लिए उपयोग किया जाता है? शायद आप कुछ समाधान के साथ समाप्त कर सकते हैं जहां आपको इसकी आवश्यकता नहीं है? आपके टेस्ट क्लास पर @ ट्रांसेक्शनल का उपयोग करने की तरह कुछ? – nick79

+0

हम डीबी की सफाई के लिए '@ DirtiesContext' का उपयोग करते थे, हालांकि यह 2-3 बार परीक्षण परीक्षण द्वारा खपत का समय बढ़ाता है। –

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