আমি 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