नियमित कक्षाओं और यूनिट परीक्षणों से स्प्रिंग बीन्स बनाना

हमारे पास स्प्रिंग का उपयोग करते हुए अमीर क्लाइंट और सर्वर दोनों हैं। और एक समस्या बहुत जल्दी उठी - साधारण वर्गों (जो स्वयं डिब्बे नहीं हैं) से वसंत डिब्बे का उपयोग कैसे करें।

सबसे पहले, दो विचार सामने आए - उन्हें निर्माणकर्ता में तर्क के रूप में आवश्यक फलियों को पारित करने या वसंत संदर्भ को संग्रहीत करने के लिए किसी प्रकार के स्थिर क्षेत्र का उपयोग करने के लिए।
पहला विचार शातिर था। यह पता चला है कि स्की सेवाओं को डिजाइनरों की लंबी श्रृंखला के माध्यम से खींचा जाना चाहिए।
दूसरे विचार को भी दोष के रूप में मान्यता दी गई थी - सवाल उठता है कि इस क्षेत्र को कौन शुरू करेगा और कब और क्या होगा इकाई परीक्षण।

जल्द ही, मैं इंटरनेट पर इस तरह के एक सुंदर विकल्प पर पहुंच गया:


@Service public class StaticContextHolder implements BeanFactoryAware { public static BeanFactory CONTEXT; public StaticContextHolder() { } public static Object getBean(String s) throws BeansException { return CONTEXT.getBean(s); } public static <T> T getBean(String s, Class<T> tClass) throws BeansException { return CONTEXT.getBean(s, tClass); } public static <T> T getBean(Class<T> tClass) throws BeansException { return CONTEXT.getBean(tClass); } public static Object getBean(String s, Object... objects) throws BeansException { return CONTEXT.getBean(s, objects); } public static boolean containsBean(String s) { return CONTEXT.containsBean(s); } @Override public void setBeanFactory(BeanFactory applicationContext) throws BeansException { logger.assertNull(CONTEXT, "CONTEXT is not null. Double Spring context creation?"); CONTEXT = applicationContext; } } 


और यह बहुत अच्छा काम करता है।
हालांकि, यूनिट परीक्षणों के लिए, मुझे इसे थोड़ा संशोधित करना पड़ा।

हमारे पास परीक्षण हैं जो एक स्प्रिंगिंग संदर्भ बनाते हैं। इसलिए, मैंने इस विधि को इस वर्ग में जोड़ा:

  @PreDestroy public void resetStatics() { CONTEXT=null; } 


दूसरे, यदि यूनिट परीक्षण स्प्रिंग कोटेक्सट नहीं बनाता है, लेकिन परीक्षण किया गया वर्ग स्टैटिककोटेक्स्टहॉल्डर का उपयोग करता है, तो यह आवश्यक है कि वह इससे निर्भरता प्राप्त करता है।

मैंने अपना डमी संदर्भ बनाया:
 public class FakeBeanFactory implements BeanFactory { private Map<String, Object> beans; public FakeBeanFactory (Map<String, Object> beans) { this.beans = beans; } @Override public Object getBean(String s) throws BeansException { return beans.get(s); } @Override public <T> T getBean(String s, Class<T> tClass) throws BeansException { return (T) beans.get(s); } @Override public <T> T getBean(Class<T> tClass) throws BeansException { return (T) beans.get(tClass.getName()); } @Override public Object getBean(String s, Object... objects) throws BeansException { return beans.get(s); } @Override public boolean containsBean(String s) { return false; //     } @Override public boolean isSingleton(String s) throws NoSuchBeanDefinitionException { return false; //     } @Override public boolean isPrototype(String s) throws NoSuchBeanDefinitionException { return false; //     } // .... } 


अब यूनिट टेस्ट का आरंभ इस तरह होता है:
  @Before public void init() { Map<String,Object> beans = new Map<String,Object>(); beans.put("service-dependency", new MockupDependencyImpl()); StaticContextHolder.CONTEXT = new FakeBeanFactory(beans)); } 


अब एक और समस्या बनी हुई है: प्रोटोटाइप बीन्स, जो कि init विधि के माध्यम से बनाए जाते हैं, उदाहरण के लिए
  <bean id="PlanDefinitionReader" class="com.example.PlanDefinitionReader" scope="prototype" factory-method="createPlanDefinitionReader"> <constructor-arg index="0" value="null"/> <constructor-arg index="1" value="null"/> <constructor-arg index="2" value="null"/> </bean> 


ऐसा करने के लिए, FakeBeanfactory में एक और मानचित्र जोड़ें:
 Map<String s, Method m> initMethods 


और एक विधि को फिर से लिखना:
  public Object getBean(String s, Object... objects) throws BeansException { return initMethods.get(s).invoke(null, objects); } 


और यूनिट टेस्ट को इनिशियलाइज़ करने के लिए स्टेटिक तरीकों के इस मैप को इनिशियलाइज़ करें।

खैर यहाँ। कुछ इस तरह।

मुझे खुशी होगी अगर कोई मुझे बताए कि इन सभी समस्याओं को हल करने के लिए सबसे अच्छा क्या है।

Source: https://habr.com/ru/post/In139093/


All Articles