स्प्रिंग डेटा रिपॉजिटरी का परीक्षण कैसे करें?


136

मैं UserRepositoryस्प्रिंग डेटा की मदद से एक रिपॉजिटरी (कहना ) चाहता हूं । मैं वसंत-डेटा (लेकिन वसंत के लिए नहीं) के लिए नया हूं और मैं इस ट्यूटोरियल का उपयोग करता हूं । डेटाबेस से निपटने के लिए प्रौद्योगिकियों की मेरी पसंद जेपीए 2.1 और हाइबरनेट है। समस्या यह है कि मैं इस तरह के भंडार के लिए इकाई परीक्षण कैसे लिखूं

create()उदाहरण के लिए विधि लेते हैं । जैसा कि मैं परीक्षण-पहले काम कर रहा हूं, मैं इसके लिए एक इकाई परीक्षण लिखने वाला हूं - और यही मैं तीन समस्याओं से टकरा रहा हूं:

  • सबसे पहले, मैं EntityManagerएक UserRepositoryइंटरफ़ेस के गैर-मौजूदा कार्यान्वयन में एक नकली का इंजेक्शन कैसे लगाऊं ? स्प्रिंग डेटा इस इंटरफ़ेस के आधार पर एक कार्यान्वयन उत्पन्न करेगा:

    public interface UserRepository extends CrudRepository<User, Long> {}

    हालांकि, मुझे नहीं पता कि इसे एक EntityManagerमॉक और अन्य मॉक का उपयोग करने के लिए कैसे मजबूर किया जाए - अगर मैंने कार्यान्वयन खुद लिखा था, तो मेरे पास शायद एक सेटर विधि होगी EntityManager, जिससे मुझे यूनिट परीक्षण के लिए अपने मॉक का उपयोग करने की अनुमति मिल सके। (वास्तविक डेटाबेस कनेक्टिविटी के लिए के रूप में, मैं एक है JpaConfigurationवर्ग, के साथ एनोटेट @Configurationऔर @EnableJpaRepositoriesहै, जो प्रोग्राम के रूप में के लिए सेम को परिभाषित करता है DataSource, EntityManagerFactory, EntityManagerआदि - लेकिन खजाने परीक्षण के अनुकूल हो सकता है और इन बातों को ओवरराइड करने के लिए अनुमति चाहिए)।

  • दूसरा, क्या मुझे बातचीत के लिए परीक्षण करना चाहिए? मेरे लिए यह पता लगाना कठिन है कि किन विधियों को कहा जाता है EntityManagerऔर Queryकहा जाना चाहिए ( verify(entityManager).createNamedQuery(anyString()).getResultList();क्योंकि वह उस पर लागू नहीं है)

  • तीसरा, क्या मैं पहले स्थान पर स्प्रिंग-डेटा-जेनरेट किए गए तरीकों को यूनिट-टेस्ट करने वाला हूं? जैसा कि मैं जानता हूं, तीसरे पक्ष के पुस्तकालय कोड को यूनिट-परीक्षण करने वाला नहीं माना जाता है - केवल डेवलपर्स द्वारा लिखे गए कोड को ही यूनिट-परीक्षण किया जाना चाहिए। लेकिन अगर यह सच है, यह अभी भी पहले सवाल को फिर से दृश्य में लाता है: कहते हैं, मेरे पास मेरी रिपॉजिटरी के लिए कुछ कस्टम तरीके हैं, जिसके लिए मैं कार्यान्वयन लिखूंगा, मैं अपने मोज़ेक को कैसे EntityManagerऔर Queryअंतिम रूप से, कैसे उत्पन्न करता हूं भंडार?

नोट: मैं एकीकरण और यूनिट परीक्षण दोनों का उपयोग करके अपने रिपॉजिटरी का परीक्षण-ड्राइविंग करूंगा । अपने एकीकरण परीक्षणों के लिए मैं एक HSQL इन-मेमोरी डेटाबेस का उपयोग कर रहा हूं, और मैं स्पष्ट रूप से यूनिट परीक्षणों के लिए डेटाबेस का उपयोग नहीं कर रहा हूं।

और शायद चौथा सवाल, क्या सही ऑब्जेक्ट ग्राफ निर्माण और ऑब्जेक्ट ग्राफ पुनर्प्राप्ति का परीक्षण एकीकरण परीक्षणों में करना सही है (कहते हैं, मेरे पास हाइबरनेट के साथ परिभाषित एक जटिल ऑब्जेक्ट ग्राफ है)?

अद्यतन: आज मैंने नकली इंजेक्शन के साथ प्रयोग जारी रखा है - मैंने नकली इंजेक्शन की अनुमति देने के लिए एक स्थिर आंतरिक वर्ग बनाया है।

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class UserRepositoryTest {

@Configuration
@EnableJpaRepositories(basePackages = "com.anything.repository")
static class TestConfiguration {

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        return mock(EntityManagerFactory.class);
    }

    @Bean
    public EntityManager entityManager() {
        EntityManager entityManagerMock = mock(EntityManager.class);
        //when(entityManagerMock.getMetamodel()).thenReturn(mock(Metamodel.class));
        when(entityManagerMock.getMetamodel()).thenReturn(mock(MetamodelImpl.class));
        return entityManagerMock;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return mock(JpaTransactionManager.class);
    }

}

@Autowired
private UserRepository userRepository;

@Autowired
private EntityManager entityManager;

@Test
public void shouldSaveUser() {
    User user = new UserBuilder().build();
    userRepository.save(user);
    verify(entityManager.createNamedQuery(anyString()).executeUpdate());
}

}

हालाँकि, इस परीक्षण को चलाने से मुझे निम्नलिखित स्टैकट्रेस मिलता है:

java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'entityManager' threw exception; nested exception is java.lang.IllegalArgumentException: JPA Metamodel must not be null!
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1493)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:121)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
    ... 28 more
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'entityManager' threw exception; nested exception is java.lang.IllegalArgumentException: JPA Metamodel must not be null!
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:108)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:62)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1489)
    ... 44 more

जवाबों:


118

tl; डॉ

इसे छोटा करने के लिए - यूनिट डेटा का परीक्षण करने का कोई तरीका नहीं है स्प्रिंग डेटा जेपीए रिपॉजिटरी एक साधारण कारण के लिए यथोचित है: यह जेपीए एपीआई के सभी हिस्सों को नकली करने के लिए बोझिल करने का तरीका है जिसे हम रिपॉजिटरी को बूटस्ट्रैप करने के लिए आमंत्रित करते हैं। इकाई परीक्षण वैसे भी यहाँ बहुत ज्यादा मायने नहीं रखते हैं, क्योंकि आप आमतौर पर किसी भी कार्यान्वयन कोड को स्वयं नहीं लिख रहे हैं (कस्टम कार्यान्वयन पर नीचे का पैराग्राफ देखें) ताकि एकीकरण परीक्षण सबसे उचित दृष्टिकोण हो।

विवरण

हम यह सुनिश्चित करने के लिए बहुत सारे अपफ्रंट सत्यापन और सेटअप करते हैं कि आप केवल एक ऐप को बूटस्ट्रैप कर सकते हैं जिसमें कोई अमान्य व्युत्पन्न प्रश्न आदि नहीं हैं।

  • हम CriteriaQueryयह सुनिश्चित करने के लिए कि क्वेरी विधियों में कोई भी टाइपोस नहीं है, व्युत्पन्न प्रश्नों के लिए कैश क्रैस बनाते हैं। इसके लिए मानदंड एपीआई के साथ-साथ मेटा.मॉडल के साथ काम करने की आवश्यकता होती है।
  • हम उन लोगों के लिए EntityManagerएक Queryउदाहरण बनाने के लिए कहकर मैन्युअल रूप से परिभाषित प्रश्नों को सत्यापित करते हैं (जो प्रभावी रूप से क्वेरी सिंटैक्स सत्यापन को ट्रिगर करता है)।
  • हम Metamodelनए चेक आदि तैयार करने के लिए संभाले गए डोमेन प्रकारों के बारे में मेटा-डेटा के लिए निरीक्षण करते हैं ।

वे सभी चीजें जो आप शायद हाथ से लिखे गए भंडार में सुरक्षित कर देंगे, जिसके कारण एप्लिकेशन रनटाइम पर टूट सकता है (अमान्य प्रश्नों आदि के कारण)।

यदि आप इसके बारे में सोचते हैं, तो आपके रिपॉजिटरी के लिए कोई कोड नहीं है, इसलिए किसी भी यूनिट टेस्ट को लिखने की कोई आवश्यकता नहीं है । मूल कीड़े को पकड़ने के लिए हमारे परीक्षण आधार पर भरोसा करने के लिए बस कोई ज़रूरत नहीं है (यदि आप अभी भी एक में दौड़ते हैं, तो टिकट लेने के लिए स्वतंत्र महसूस करें )। हालांकि, आपकी दृढ़ता परत के दो पहलुओं का परीक्षण करने के लिए निश्चित रूप से एकीकरण परीक्षणों की आवश्यकता है क्योंकि वे आपके डोमेन से संबंधित पहलू हैं:

  • संस्था मैपिंग
  • क्वेरी शब्दार्थ (वाक्य रचना वैसे भी प्रत्येक बूटस्ट्रैप प्रयास पर सत्यापित है)।

एकीकरण परीक्षण

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

कस्टम कार्यान्वयन का परीक्षण करना

रिपॉजिटरी के कस्टम कार्यान्वयन भागों को इस तरह से लिखा जाता है कि उन्हें स्प्रिंग डेटा जेपीए के बारे में जानने की ज़रूरत नहीं है। वे सादे स्प्रिंग बीन्स हैं जिन्हें एक EntityManagerइंजेक्शन मिलता है। आप निश्चित रूप से इसके साथ बातचीत का मजाक उड़ाने की कोशिश कर सकते हैं, लेकिन ईमानदार होने के लिए, जेपीए का परीक्षण करना हमारे लिए बहुत सुखद अनुभव नहीं रहा है और साथ ही साथ यह काफी अप्रत्यक्ष ( EntityManager-> CriteriaBuilder, CriteriaQueryआदि) के साथ काम करता है । कि तुम अंत में नकली और इतने पर लौट रहे मॉक के साथ।


5
क्या आपके पास इन-मेमोरी डेटाबेस (जैसे h2) के साथ एकीकरण परीक्षण के एक छोटे से उदाहरण के लिए लिंक है?
विम डेलाउवे

7
यहां के उदाहरण HSQLDB का उपयोग करते हैं। एच 2 में स्विच करना मूल रूप से निर्भरता के आदान-प्रदान का मामला है pom.xml
ओलिवर ड्रोट्बोहम

3
धन्यवाद, लेकिन मैं एक उदाहरण देखने की उम्मीद कर रहा था जो डेटाबेस को पहले से पॉप्युलेट करता है और / या वास्तव में डेटाबेस की जांच करता है।
विम डेलाउवे

1
"एक तरह से लिखा गया" के पीछे लिंक अब काम नहीं करता है। शायद आप इसे अपडेट कर सकते हैं?
विम डेलाउवे

1
तो, आप कस्टम कार्यान्वयन के लिए यूनिट परीक्षणों के बजाय एकीकरण परीक्षणों का उपयोग करने का प्रस्ताव करते हैं? और उनके लिए यूनिट टेस्ट बिल्कुल नहीं लिखें? केवल स्पष्ट करने हेतु। यदि हाँ तो ठीक है। मैं इसका कारण समझता हूं (सभी चीजों का मजाक उड़ाना भी जटिल है)। मैं जेपीए परीक्षण के लिए नया हूं इसलिए मैं अभी इसका पता लगाना चाहता हूं।
रुस्लान स्टेलमचेंको

48

स्प्रिंग बूट + स्प्रिंग डेटा के साथ यह काफी आसान हो गया है:

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    MyRepository subject;

    @Test
    public void myTest() throws Exception {
        subject.save(new MyEntity());
    }
}

@ हेज़ द्वारा समाधान पूर्ण संदर्भ लाता है, यह केवल वही लाता है जो काम करने के लिए जेपीए + लेनदेन के लिए आवश्यक है। ध्यान दें कि ऊपर दिया गया समाधान मेमोरी टेस्ट डेटाबेस में लाया जाएगा जो कि क्लासपाथ पर पाया जा सकता है।


7
यह एक एकीकरण परीक्षण है, न कि इकाई परीक्षण जिसे ओपी ने उल्लेख किया है
इवो ​​कुचरस्की

16
@IwoKucharski। आप शब्दावली के बारे में सही हैं। हालाँकि: यह देखते हुए कि स्प्रिंग डेटा आपके लिए इंटरफ़ेस लागू करता है, आपको स्प्रिंग का उपयोग करने के लिए कड़ी मेहनत की जाती है और उस समय यह एक एकीकरण परीक्षण बन जाता है। अगर मैंने इस तरह का सवाल पूछा तो मैंने शायद शब्दावली के बारे में सोचे बिना एक यूनिट टेस्ट के लिए भी कहा। इस प्रकार मैंने यह नहीं देखा कि प्रश्न के मुख्य या केंद्रीय बिंदु के रूप में।
मार्कस T

@RunWith(SpringRuner.class)अब पहले से ही इसमें शामिल है @DataJpaTest
मारून

@ इवोक्युर्स्की, यह एकीकरण परीक्षण क्यों है, इकाई परीक्षण नहीं?
user1182625

@ user1182625 @RunWith(SpringRunner.classवसंत संदर्भ शुरू करता है जिसका अर्थ है कि यह कई इकाइयों के बीच एकीकरण की जाँच कर रहा है। यूनिट परीक्षण एकल इकाई -> एकल वर्ग का परीक्षण कर रहा है। फिर आप MyClass sut = new MyClass();sut ऑब्जेक्ट (टेस्ट के तहत sut = सेवा) लिखें
Iwo Kucharski

21

यह थोड़ा बहुत देर से आ सकता है, लेकिन मैंने इसके लिए बहुत कुछ लिखा है। मेरी लाइब्रेरी आपके लिए बुनियादी क्रूड रिपॉजिटरी विधियों का मज़ाक उड़ाएगी और साथ ही आपके क्वेरी विधियों की अधिकांश कार्यप्रणाली की व्याख्या करेगी। आपको अपने स्वयं के मूल प्रश्नों के लिए कार्यात्मकताओं को इंजेक्ट करना होगा, लेकिन बाकी सब आपके लिए किया जाता है।

जरा देखो तो:

https://github.com/mmnaseri/spring-data-mock

अपडेट करें

यह अब मावेन केंद्रीय और बहुत अच्छे आकार में है।


16

यदि आप स्प्रिंग बूट का उपयोग कर रहे हैं, तो आप बस @SpringBootTestमें लोड करने के लिए उपयोग कर सकते हैं ApplicationContext(जो कि आपके स्टैकट्रेस आपके बारे में भौंक रहा है)। यह आपको अपने स्प्रिंग-डेटा रिपॉजिटरी में ऑटोवेयर करने की अनुमति देता है। जोड़ना सुनिश्चित करें @RunWith(SpringRunner.class)ताकि वसंत-विशिष्ट एनोटेशन उठाए जाएं:

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrphanManagementTest {

  @Autowired
  private UserRepository userRepository;

  @Test
  public void saveTest() {
    User user = new User("Tom");
    userRepository.save(user);
    Assert.assertNotNull(userRepository.findOne("Tom"));
  }
}

आप उनके डॉक्स में स्प्रिंग बूट में परीक्षण के बारे में अधिक पढ़ सकते हैं ।


यह एक अच्छा उदाहरण है, लेकिन मेरे विचार से सरल है। क्या ऐसी कोई परिस्थितियां हैं जिनमें यह परीक्षा भी विफल हो सकती है ??
होपकिंग

यह एक प्रति नहीं है, लेकिन मान लीजिए कि आप परीक्षण करना चाहते थे Predicate(जो मेरा उपयोग मामला था) यह काफी अच्छी तरह से काम करता है।
Heez

1
मेरे लिए भंडार हमेशा शून्य है। कोई मदद?
अतुल चौधरी

यह imho सबसे अच्छा जवाब है। इस तरह आप CrudRepo, Entity और DDL स्क्रिप्ट का परीक्षण करते हैं जो Entity की तालिका बनाते हैं।
मिरांडाविराक्रूजडेलाहोआकार्डिना

मैंने इस तरह से एक परीक्षा लिखी है। यह पूरी तरह से काम करता है जब रिपॉजिटरी का कार्यान्वयन jdbcTemplate का उपयोग करता है। हालाँकि, जब मैं स्प्रिंग-डेटा (रिपॉजिटरी से इंटरफ़ेस को बढ़ाकर) के लिए कार्यान्वयन को बदल देता हूं, तो परीक्षण विफल हो जाता है और userRepository.findOne शून्य हो जाता है। कैसे हल करने के लिए कोई विचार?
रेगा

8

वसंत बूट 2.1.1 के अंतिम संस्करण में। कृपया , यह सरल है:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SampleApplication.class)
public class CustomerRepositoryIntegrationTest {

    @Autowired
    CustomerRepository repository;

    @Test
    public void myTest() throws Exception {

        Customer customer = new Customer();
        customer.setId(100l);
        customer.setFirstName("John");
        customer.setLastName("Wick");

        repository.save(customer);

        List<?> queryResult = repository.findByLastName("Wick");

        assertFalse(queryResult.isEmpty());
        assertNotNull(queryResult.get(0));
    }
}

पूरा कोड:

https://github.com/jrichardsz/spring-boot-templates/blob/master/003-hql-database-with-integration-test/src/test/java/test/CustomerRepositoryIntegrationTest.java


3
यह अधूरा है 'उदाहरण': निर्मित नहीं किया जा सकता है, "एकीकरण" परीक्षण उत्पादन कोड के समान कॉन्फ़िगरेशन का उपयोग करता है। अर्थात। किसी काम का नहीं।
मार्टिन मुचा

मैं क्षमाप्रार्थी हूं। मैं इस त्रुटि के कारण मुझे कोड़े मारेगा। कृपया एक बार फिर कोशिश करें!
JRichardsz

यह 2.0.0.RELEASEस्प्रिंग बूट के साथ भी काम करता है ।
नटाल

आपको इस परीक्षण में एम्बेडेड db fot का उपयोग करना चाहिए
TuGordoBello

7

जब आप वास्तव में स्प्रिंग डेटा रिपॉजिटरी के लिए आई-टेस्ट लिखना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

@RunWith(SpringRunner.class)
@DataJpaTest
@EnableJpaRepositories(basePackageClasses = WebBookingRepository.class)
@EntityScan(basePackageClasses = WebBooking.class)
public class WebBookingRepositoryIntegrationTest {

    @Autowired
    private WebBookingRepository repository;

    @Test
    public void testSaveAndFindAll() {
        WebBooking webBooking = new WebBooking();
        webBooking.setUuid("some uuid");
        webBooking.setItems(Arrays.asList(new WebBookingItem()));
        repository.save(webBooking);

        Iterable<WebBooking> findAll = repository.findAll();

        assertThat(findAll).hasSize(1);
        webBooking.setId(1L);
        assertThat(findAll).containsOnly(webBooking);
    }
}

इस उदाहरण का पालन करने के लिए आपको इन निर्भरताओं का उपयोग करना होगा:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

5

मैंने इसे इस तरह से हल किया है -

    @RunWith(SpringRunner.class)
    @EnableJpaRepositories(basePackages={"com.path.repositories"})
    @EntityScan(basePackages={"com.model"})
    @TestPropertySource("classpath:application.properties")
    @ContextConfiguration(classes = {ApiTestConfig.class,SaveActionsServiceImpl.class})
    public class SaveCriticalProcedureTest {

        @Autowired
        private SaveActionsService saveActionsService;
        .......
        .......
}

4

JUnit5 और @DataJpaTestपरीक्षण की तरह दिखेगा (कोटलिन कोड):

@DataJpaTest
@ExtendWith(value = [SpringExtension::class])
class ActivityJpaTest {

    @Autowired
    lateinit var entityManager: TestEntityManager

    @Autowired
    lateinit var myEntityRepository: MyEntityRepository

    @Test
    fun shouldSaveEntity() {
        // when
        val savedEntity = myEntityRepository.save(MyEntity(1, "test")

        // then 
        Assertions.assertNotNull(entityManager.find(MyEntity::class.java, savedEntity.id))
    }
}

इकाई स्थिति को मान्य करने के लिए आप पैकेज TestEntityManagerसे उपयोग कर सकते हैं org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager


इकाई बीन के लिए आईडी बनाने के लिए इसका हमेशा बेहतर वसंत है।
अरुणदेव

जावा के लिए दूसरी पंक्ति है: @ExtendWith (मान = SpringExtension.class)
AdilOoze
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.