मैं एक @Repository/@Service एकीकरण परीक्षण लिख रहा हूं जो एक एम्बेडेड डेटाबेस का लाभ उठाता है। मेरी टेस्ट क्लास में, मैं अपने डेटाबेस को कुछ डेटा के साथ प्रीलोड करना चाहता हूं।

मैं वर्तमान में अपने नमूना डेटा में लोड करने के लिए @BeforeEach का उपयोग कर रहा हूं, हालांकि, यह कोड मेरी कक्षा में प्रत्येक परीक्षण पर चलाया जाता है।

स्प्रिंग एप्लिकेशन संदर्भ लोड होने के बाद क्या कोई तरीका है कि मैं अपने परीक्षण डेटा में लोड कर सकता हूं, लेकिन किसी भी परीक्षण को चलाने से पहले?

मेरा वर्तमान दृष्टिकोण:

@BeforeEach
public void before() {
    repository.save(...); // -> prepopulates repository with sample data
}

@Test
public void testService() {
    service.get(...); // -> gathers existing record
}

@Test
public void deleteById() {
    service.delete(...); // -> deletes existing record
}

हालांकि... इसके साथ, मुझे प्रत्येक परीक्षण के बाद रिकॉर्ड्स को फ्लश करना होगा। अन्यथा किसी भी अनूठी बाधा का आसानी से उल्लंघन किया जा सकता है।

@BeforeEach का उपयोग करने के बजाय, जिसे प्रत्येक परीक्षण से पहले चलाना आवश्यक है... क्या इसे @BeforeAll प्रकार के फैशन में लोड करना संभव है जो स्प्रिंग एप्लिकेशन संदर्भ लोड होने के बाद होता है?

0
shinjw 2 सितंबर 2020, 22:41

3 जवाब

सबसे बढ़िया उत्तर

स्प्रिंग एप्लिकेशन संदर्भ लोड होने के बाद क्या कोई तरीका है कि मैं अपने परीक्षण डेटा में लोड कर सकता हूं?

मूल रूप से हाँ, मुझे लगता है कि आप ऐसा कर सकते हैं:

अनुप्रयोग संदर्भ प्रारंभ होने पर या प्रारंभ होने की प्रक्रिया में SQL डेटा लोड करने का विचार है।

उदाहरण के लिए, फ्लाईवे के साथ स्प्रिंग बूट एकीकरण इस तरह से काम करता है (फ्लाईवे का बीन बनाया और लोड किया जाता है)। तो, सिद्धांत रूप में, आप केवल परीक्षण माइग्रेशन के साथ फ्लाईवे का उपयोग कर सकते हैं जिसमें परीक्षण डेटा पीढ़ी की सभी प्रासंगिक SQL स्क्रिप्ट शामिल होंगी।

आप इसे तकनीकी रूप से कैसे कर सकते हैं?

यहाँ एक तरीका है:

एक विशेष बीन बनाएं (जिस तरह से यह फ्लाईवे के साथ काम करता है) जो आपके भंडार पर निर्भर करेगा और पोस्ट निर्माण में डेटा को बचाएगा:

@Component
public class SqlGenerationBean {

   @Autowired
   private MyRepository repo;

   @PostConstruct
   public void init() {
      repo.save();
   } 
}

ऐसा करने का एक अन्य तरीका एक श्रोता बनाना है जिसे शुरू किए गए एप्लिकेशन संदर्भ पर कॉल किया जाएगा और फिर से उसी repo.save() को कॉल किया जाएगा।

दोनों ही मामलों में बीन/श्रोता कोड उत्पादन से सुलभ नहीं होना चाहिए (यह केवल परीक्षणों के लिए है): इसलिए इसे src/test/java के तहत कहीं रखें उदाहरण के लिए

अब एक बार एप्लिकेशन संदर्भ शुरू हो जाने के बाद आप एक साफ-सुथरी चाल का उपयोग कर सकते हैं:

अपने परीक्षणों को @Transactional एनोटेशन से चिह्नित करें। स्प्रिंग कोड को एक कृत्रिम लेनदेन में लपेट देगा जो स्वचालित रूप से वापस लुढ़क जाएगा (भले ही परीक्षण सफल हो) ताकि परीक्षण के दौरान आपके द्वारा संशोधित किया जाने वाला सभी डेटा वापस लुढ़क जाएगा और मूल रूप से प्रत्येक परीक्षण से पहले, आपके पास होगा एक ही स्थिति (जो अनुप्रयोग संदर्भ शुरू होने के बाद/बाद में डेटाबेस की स्थिति के समान है)। बेशक, यदि आप परीक्षण में डीडीएल का उपयोग करते हैं, तो कुछ डेटाबेस इसे लेनदेन का हिस्सा नहीं बना सकते हैं, लेकिन यह वास्तव में डेटाबेस पर निर्भर करता है।

यहां एक और दिलचस्प बात यह है कि एप्लिकेशन संदर्भ को परीक्षण मामलों (केवल एक बार बनाया गया) के बीच भी कैश किया जा सकता है, इसलिए इसे ध्यान में रखें।

1
Mark Bramnik 2 सितंबर 2020, 23:22

इस मामले में मैं सिर्फ टेस्ट क्लास के लिए एक कंस्ट्रक्टर बनाऊंगा। इसे हर चीज से पहले ट्रिगर किया जाएगा।

@BeforeEach प्रत्येक परीक्षण से पहले लेकिन सभी आरंभीकरण के बाद चलता है।

आप केवल मॉकिटो का उपयोग कर सकते हैं और परिणाम को साफ करने और अधिक जटिल करने की आवश्यकता के बिना नकल कर सकते हैं

0
PepeRaikkonen 2 सितंबर 2020, 22:53

बस अपने कोड में निम्नलिखित स्निपेट जोड़ें। यह ठीक वैसे ही है जैसे आप यह पता लगाने के लिए कर सकते हैं कि Spring एप्लिकेशन वास्तव में शुरू हो गया है।

@Configuration
public class AppConfig implements ApplicationListener<ApplicationReadyEvent> {

    /**
     * This is to indicate in the logs when the application has actually started and everything is loaded.
     */
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        ApplicationContext context = event.getApplicationContext();
        Environment env = context.getEnvironment();
        // do what you want on application start
    }
}

पी.एस. परीक्षण में डेटाबेस हेरफेर के लिए @Sql सबसे अच्छा उम्मीदवार है जैसा कि टिप्पणी में उल्लेख किया गया था।

1
oleg.cherednik 2 सितंबर 2020, 23:03