স্প্রিং ডেটা সংগ্রহস্থলগুলি কীভাবে পরীক্ষা করবেন?


136

আমি UserRepositoryস্প্রিং ডেটার সাহায্যে তৈরি একটি সংগ্রহস্থল (বলুন ) চাই । আমি স্প্রিং-ডেটাতে নতুন (তবে বসন্তে নয়) এবং আমি এই টিউটোরিয়ালটি ব্যবহার করি । ডাটাবেস নিয়ে কাজ করার জন্য প্রযুক্তির আমার পছন্দটি হল জেপিএ ২.১ এবং হাইবারনেট। সমস্যাটি হ'ল আমি এই জাতীয় সংগ্রহস্থলের জন্য ইউনিট পরীক্ষাগুলি কীভাবে লিখব তা সম্পর্কে নির্লিপ্ত।

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চূড়ান্তভাবে ইনজেক্ট করব , উত্পন্ন সংগ্রহস্থলের?

দ্রষ্টব্য: আমি ইন্টিগ্রেশন এবং ইউনিট পরীক্ষার উভয় ব্যবহার করে আমার সংগ্রহস্থলগুলি পরীক্ষা-চালনা করব । আমার সংহতকরণ পরীক্ষার জন্য আমি এইচএসকিউএল ইন মেমরি ডাটাবেস ব্যবহার করছি এবং আমি অবশ্যই ইউনিট পরীক্ষার জন্য একটি ডাটাবেস ব্যবহার করছি না।

এবং সম্ভবত চতুর্থ প্রশ্ন, ইন্টিগ্রেশন পরীক্ষায় সঠিক অবজেক্ট গ্রাফ তৈরি এবং অবজেক্ট গ্রাফের পুনরুদ্ধার পরীক্ষা করা কি সঠিক (বলুন, আমার একটি জটিল বস্তু গ্রাফ হাইবারনেটের সাথে সংজ্ঞায়িত হয়েছে)?

আপডেট: আজ আমি মক ইনজেকশন নিয়ে পরীক্ষা চালিয়ে যাচ্ছি - মোককে ইনজেকশন দেওয়ার অনুমতি দেওয়ার জন্য আমি একটি স্থিতিশীল অভ্যন্তর শ্রেণি তৈরি করেছি।

@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; ড

এটিকে সংক্ষিপ্ত করে তোলার জন্য - কোনও সাধারণ কারণে স্প্রিং ডেটা জেপিএ সংগ্রহস্থলগুলির একক পরীক্ষার কোনও উপায় নেই: এটি জেপিএ এপিআইয়ের সমস্ত অংশকে উপহাস করার মতো জটিল উপায় the ইউনিট পরীক্ষাগুলি এখানে যাইহোক, খুব বেশি অর্থবোধ করে না, কারণ আপনি সাধারণত কোনও প্রয়োগকরণ কোড নিজেরাই লিখছেন না (কাস্টম বাস্তবায়নের উপরের নীচের অনুচ্ছেদটি দেখুন) যাতে সংহতকরণ পরীক্ষাটি সবচেয়ে যুক্তিসঙ্গত পন্থা।

বিস্তারিত

আপনি কেবলমাত্র এমন কোনও অ্যাপ্লিকেশন বুটস্ট্রেপ করতে পারবেন যাতে কোনও অবৈধ উত্পন্ন প্রশ্নাবলী নেই make

  • CriteriaQueryউত্সযুক্ত ক্যোয়ারীগুলিতে কোনও টাইপস না রয়েছে তা নিশ্চিত করার জন্য আমরা উদ্ভূত প্রশ্নের জন্য উদাহরণ তৈরি এবং ক্যাশে করেছি । এর জন্য মেটা.মোডেলের পাশাপাশি ক্রিটারিয়া এপিআইয়ের সাথে কাজ করা প্রয়োজন।
  • আমরা ম্যানুয়ালি সংজ্ঞায়িত জিজ্ঞাসাগুলি যাচাই করেছিলাম (যা কার্যকরভাবে ক্যোয়ারী সিনট্যাক্স বৈধতা কার্যকর করে) তাদের জন্য EntityManagerএকটি Queryউদাহরণ তৈরি করতে বলুন ।
  • আমরা Metamodelনতুন চেক ইত্যাদি প্রস্তুত করতে পরিচালিত ডোমেনের প্রকারগুলি সম্পর্কে মেটা-ডেটা পরিদর্শন করি etc.

আপনি সম্ভবত কোনও হাতে লিখিত সংগ্রহস্থল স্থগিত করতে চান এমন সমস্ত উপাদান যা রানটাইমের সময় অ্যাপ্লিকেশনটি ভেঙে দিতে পারে (অবৈধ অনুসন্ধানের কারণে ইত্যাদি)।

আপনি যদি এটির বিষয়ে চিন্তা করেন তবে আপনার ভাণ্ডারগুলির জন্য লেখার কোনও কোড নেই, সুতরাং কোনও ইউনিট পরীক্ষা লেখার দরকার নেই । বেসিক বাগগুলি ধরার জন্য আপনি যেমন আমাদের পরীক্ষার ভিত্তিতে নির্ভর করতে পারেন তেমন কোনও প্রয়োজন নেই (যদি আপনি এখনও এটির মধ্যে চলে যান তবে টিকিট বাড়ানো নির্দ্বিধায় )। তবে আপনার অধ্যবসায় স্তরের দুটি দিক যাচাই করার জন্য অবশ্যই ইন্টিগ্রেশন টেস্টের প্রয়োজন রয়েছে কারণ এটি আপনার ডোমেনের সাথে সম্পর্কিত aspects

  • সত্তা ম্যাপিং
  • কোয়েরেন্ট সিমানটিকস (সিনট্যাক্স যাইহোক যাইহোক প্রতিটি বুটস্ট্র্যাপ প্রচেষ্টাতে যাচাই করা হয়)।

সংহতকরণ পরীক্ষা

এটি সাধারণত ইন-মেমরি ডাটাবেস এবং টেস্ট কেসগুলি ব্যবহার করে সম্পন্ন হয় যা সাধারণত একটি স্প্রিংকে বুটস্ট্র্যাপ করে যা ApplicationContextসাধারণত টেস্ট কনটেক্সট ফ্রেমওয়ার্কের মাধ্যমে (যেমন আপনি ইতিমধ্যে করছেন), ডাটাবেসটিকে প্রাক-জন-উপস্থাপন করে ( EntityManagerঅথবা রেপোর মাধ্যমে অবজেক্টের উদাহরণগুলি সন্নিবেশ করে বা একটি সরল মাধ্যমে) এসকিউএল ফাইল) এবং তারপরে ফলাফলগুলি যাচাই করার জন্য ক্যোয়ারী পদ্ধতিগুলি কার্যকর করুন।

কাস্টম বাস্তবায়ন পরীক্ষা করা

সংগ্রহস্থলের কাস্টম প্রয়োগের অংশগুলি এমনভাবে লেখা থাকে যাতে তাদের স্প্রিং ডেটা জেপিএ সম্পর্কে জানতে হবে না। তারা স্পষ্ট স্প্রিং মটরশুটি যা একটি EntityManagerইনজেকশন পাওয়া যায়। আপনি অবশ্যই তা সঙ্গে পারস্পরিক ক্রিয়ার উপহাস কিন্তু সৎ হতে চেষ্টা ওয়ানা পারে, ইউনিট-পরীক্ষার JPA আমাদের জন্য একটি খুব সুন্দর অভিজ্ঞতা সেইসাথে এটা বেশ indirections অনেক সঙ্গে কাজ করে নি ( EntityManager-> CriteriaBuilder, CriteriaQueryইত্যাদি) তাই আপনি যে উপহাসগুলি ফিরে আসছেন তা নিয়ে শেষ হবে ocks


5
কোনও মেমোরি ডাটাবেস (যেমন এইচ 2) এর সাথে ইন্টিগ্রেশন টেস্টের একটি ছোট্ট উদাহরণের সাথে আপনার কি লিঙ্ক আছে?
উইম দেবলাওয়ে

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। আপনি পরিভাষা সম্পর্কে সঠিক। তবে: যে স্প্রিং ডেটা আপনার জন্য ইন্টারফেস প্রয়োগ করে, আপনি স্প্রিং ব্যবহার করতে কঠোরভাবে চাপলেন এবং সেই সময়ে এটি একটি ইন্টিগ্রেশন টেস্টে পরিণত হয়। আমি যদি এই জাতীয় কোনও প্রশ্ন জিজ্ঞাসা করি তবে আমি সম্ভবত পরিভাষাটি সম্পর্কে চিন্তা না করে ইউনিট টেস্টের জন্যও বলেছিলাম। সুতরাং আমি যে প্রশ্নের প্রধান, বা এমনকি কেন্দ্রীয়, পয়েন্ট হিসাবে এটি দেখতে পেলেন না।
মার্কাস টি

@RunWith(SpringRuner.class)ইতিমধ্যে ইতিমধ্যে অন্তর্ভুক্ত করা হয়েছে @DataJpaTest
মারুন

@ আইওকুচারস্কি, কেন এটি ইউনিট পরীক্ষা নয়, ইন্টিগ্রেশন টেস্ট?
ব্যবহারকারী 1182625

@ ব্যবহারকারী 1182625 @RunWith(SpringRunner.classবসন্তের প্রসঙ্গটি শুরু করে যার অর্থ এটি বেশ কয়েকটি ইউনিটের মধ্যে সংহতকরণ পরীক্ষা করে। ইউনিট পরীক্ষাটি একটি একক -> একক শ্রেণীর পরীক্ষা করছে is তারপরে আপনি লিখুন MyClass sut = new MyClass();এবং পরীক্ষা করুন সট অবজেক্ট (পরীক্ষার অধীনে সুত = পরিষেবা)
ইও কুচারস্কি

21

এটি কিছুটা দেরিতে আসতে পারে তবে আমি এই উদ্দেশ্যেই কিছু লিখেছি। আমার গ্রন্থাগারটি আপনার জন্য প্রাথমিক ক্রড সংগ্রহস্থলগুলি উপহাস করার পাশাপাশি আপনার ক্যোয়ারী পদ্ধতির বেশিরভাগ কার্যকারিতা ব্যাখ্যা করবে interpret আপনার নিজের নেটিভ ক্যোয়ারীগুলির জন্য আপনাকে ক্রিয়াকলাপগুলি ইনজেক্ট করতে হবে, তবে বাকিগুলি আপনার জন্য করা হয়েছে।

দেখা যাক:

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(যা আমার ব্যবহারের ক্ষেত্রে) এটি বেশ ভাল কাজ করে।
হিজ

1
আমার জন্য সংগ্রহস্থল সর্বদা শূন্য থাকে। কোন সাহায্য?
অতুল চৌধুরী চৌধুরী

এই imho সেরা উত্তর। এইভাবে আপনি ক্রুডেপো, সত্তা এবং ডিডিএল স্ক্রিপ্টগুলি পরীক্ষা করে যা সত্তার সারণী তৈরি করে।
মিরান্ডাভেরাক্রুজডেলেহোয়াকার্ডিনা

আমি ঠিক এই মত একটি পরীক্ষা লিখেছি। সংগ্রহস্থলের বাস্তবায়ন যখন jdbcTemplate ব্যবহার করে এটি নিখুঁতভাবে কাজ করে। যাইহোক, যখন আমি স্প্রিং-ডেটার (রিপোজিটরি থেকে ইন্টারফেস প্রসারিত করে) বাস্তবায়ন পরিবর্তন করি তখন পরীক্ষাটি ব্যর্থ হয় এবং ইউজাররেপোসিটরি.ফাইন্ডওন বাতিল হয়। এটি সমাধান করার জন্য কোন ধারণা?
রেগা

8

স্প্রিং বুটের শেষ সংস্করণে ২.১.১.আরলেস , এটি সহজ:

@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
এটি বরং অসম্পূর্ণ 'উদাহরণ': তৈরি করা যায় না, "সংহতকরণ" পরীক্ষাগুলি উত্পাদন কোড হিসাবে একই কনফিগারেশন ব্যবহার করে। অর্থাৎ। কোন কাজের না.
মার্টিন মুচা

আমি ক্ষমা প্রার্থনা করছি. এই ত্রুটির কারণে আমি আমাকে চাবুক দেব। আবার চেষ্টা করুন!
জে রিচার্ডস্জ

এটি 2.0.0.RELEASEস্প্রিং বুটের সাথেও কাজ করে ।
নিটাল

আপনার এই পরীক্ষাটি এম্বেডড ডিবি
ফট

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


সত্তার শিমের জন্য আইডি উত্পন্ন করার জন্য এটি সর্বদা ভাল বসন্ত।
অরুণদেব

জাভা এর জন্য দ্বিতীয় লাইনটি হল: @ এক্সটেনডিজিথ (মান = স্প্রিংএক্সটেনশন.class)
আদিলওজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.