2012-07-03 11 views
22

वसंत 3.1 से, हम JavaConfig का उपयोग आसानी से @Enable* एनोटेशन के लिए कर सकते हैं।क्यों वसंत 3.1 WebMvcConfig के साथ इकाई परीक्षण विफल रहता है?

इसलिए मैंने WebMvc कॉन्फ़िगरेशन सेट करने के लिए WebConfig बनाया, और इसका परीक्षण करने का प्रयास किया। लेकिन अगर मैं WebMvcConfigurerAdapter या WebMvc कॉन्फ़िगरेशन का विस्तार करता हूं WebConfig के साथ समर्थन यूनिट परीक्षण ServletContext की कमी के कारण विफल रहता है। कोड और संदेश नीचे की तरह दिखते हैं।

WebConfig.java

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurationSupport {} 

Test.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=WebConfig.class) 
public class TestFail { 
    @Test 
    public void test() {} 
} 

संदेश

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
... 
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.util.Assert.notNull(Assert.java:112) 
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:54) 
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:253) 
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1.CGLIB$defaultServletHandlerMapping$10(<generated>) 
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1$$FastClassByCGLIB$$19b86ad0.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280) 
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1.defaultServletHandlerMapping(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:149) 
    ... 41 more 

कैसे इकाई ठीक से परीक्षण करने के लिए WebConfig?

संपादित

रूप गार्सिया ने कहा, इस बग स्प्रिंग 3.2.0.RC1 में तय हो गई है।

बस परीक्षा कक्षा में @WebAppConfiguration एनोटेशन जोड़ें।

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes=WebConfig.class) 
public class TestFail { 
    @Test 
    public void test() {} 
} 
+1

मुझे समझ नहीं आता कि कैसे इस सवाल का तो कुछ वोट है। मुझे लगता है कि वहाँ वसंत 3.1 niceties के साथ एकीकरण परीक्षण करने की कोशिश कर रहे हैं ... –

+1

सवाल ठीक वही था जो मैं खोज रहा था और उत्तर "संपादन" खंड –

उत्तर

6

वहाँ एक बग है

कृपया हमें बताएं कि क्या आपको स्प्रिंग 3.1 के लिए कोई कामकाज मिल रहा है, अगर हमें वहां 3.2 तक इंतजार नहीं करना चाहिए। मुझे कहना है कि मैंने बस स्प्रिंग 3.2.0.एम 2 के साथ कोशिश की है और यह अभी भी मेरे लिए काम नहीं कर रहा है।

+1

3.2.0.आरसी 1 बाहर है और बग तय है। यह 3.2.0.M2 पर भी काम करना चाहिए, जब तक आप अपने परीक्षण कक्षाओं को @WebApp कॉन्फ़िगरेशन के साथ एनोटेट करते हैं। –

7

@EnableWebMvc एनोटेशन की आवश्यकता होती है ServletContext तो मैं सेम परिभाषाएँ जो इकाई परीक्षण और अन्य विन्यास जो आवेदन और ढांचे द्वारा इस्तेमाल किया में उपयोग किया जाएगा करने के लिए अपने config विभाजित करने के लिए सुझाव है तो। इस मामले में आवेदन दोनों विन्यास आयात करेगा और यूनिट परीक्षण केवल एक आयात करेंगे।

BeansConfig.java:

@Configuration 
public class BeansConfig { 
    @Bean 
    MyBean myBean() { 
     return new MyBean() 
    } 
} 

WebConfig.java:

@Configuration 
@EnableWebMvc 
@Import(BeansConfig.class) 
public class WebConfig extends WebMvcConfigurationSupport {} 

TestFail.java:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=BeansConfig.class) 
public class TestFail { 
    @Test 
    public void test() {} 
} 
+0

वास्तव में, मैं यही कर रहा हूं अभी व। मुझे आश्चर्य है कि इकाई परीक्षण क्यों विफल रहता है। यह ठीक था जब स्प्रिंग 3.0 में एक्सएमएल के साथ कॉन्फ़िगर किया गया था। –

2

एक और सिफारिश मैं हो जाएगा कि spring-test-mvc, जो आंतरिक रूप से के लिए एक नकली सर्वलेट संदर्भ बनाता है उपयोग करने के लिए Contr काम करने के लिए oller परीक्षण।

आप अपने दृष्टिकोण के साथ जारी रखना चाहते हैं, तो आप फिर अपने स्प्रिंग प्रसंग लोडर कि इसके अलावा एक नकली सर्वलेट संदर्भ initializes बनाने के लिए हो सकता है - इन पंक्तियों के साथ: http://tedyoung.me/2011/02/14/spring-mvc-integration-testing-controllers/, से Spring-test-mvc source

12

जैसा कि गिडो ने पहले उल्लेख किया था, इसे 3.2 के रूप में हल किया गया है। नए परीक्षण सुधारों का लाभ उठाने के बारे में विवरण निम्नलिखित हैं। यह सुनिश्चित करें कि एक सर्वलेट संदर्भ अपने परीक्षण के लिए भरी हुई है, तो आप के रूप में नीचे @WebAppConfiguration के साथ अपने परीक्षण व्याख्या और AnnotationConfigWebContextLoader अपने संदर्भ लोडर के रूप में परिभाषित करने के लिए, की जरूरत है:

@RunWith(SpringJUnit4ClassRunner.class)  
@WebAppConfiguration 
@ContextConfiguration(
    classes = MyWebConfig.class, 
    loader = AnnotationConfigWebContextLoader.class) 
public class MyTest { 
    //... 
} 
+0

क्या आप समझा सकते हैं कि इन परीक्षण मामलों में एप्लिकेशन वसंत संदर्भ कौन सा है। मैं MyWebConfig क्लास की सराहना करता हूं वेब ऐप शुरू करने के लिए servlet-context.xml फ़ाइल को प्रतिस्थापित करता है, लेकिन यदि हमारा नियंत्रक इंजेक्शन के लिए अन्य बीन्स पर निर्भर है तो यह कैसे किया जाता है। अन्य उदाहरणों में 'location = classparth = context.xml' को कॉन्टेक्स्ट कॉन्फ़िगरेशन में पास किया गया है - क्या यह उपर्युक्त उदाहरण में अभी भी संभव है? – emeraldjava

+1

'@ कॉन्फ़िगरेशन' कक्षा में। यह परिभाषित करता है कि 'घटक', '@ नियंत्रक ',' @ सेवा 'इत्यादि के रूप में एनानेटेड बीन्स के लिए कौन से क्लासपाथ स्कैन किए जाने चाहिए। यह XML संदर्भ आयात करने के लिए' आयात 'एनोटेशन का भी उपयोग कर सकता है। यदि आप चाहें तो विशेष रूप से अपने परीक्षणों के लिए '@ कॉन्फ़िगरेशन' कक्षाएं बना सकते हैं। – Steve

+0

धन्यवाद। हमारे वास्तविक वेब ऐप में, मेरे पास web.xml फ़ाइल में एक ContextLoaderListener है जो संदर्भ कॉन्फ़िगर स्थान = '/ WEB-INF/applicationContext.xml' लोड करता है। मेरे टेस्ट केस के लिए, मुझे लगता है कि आप सुझाव दे रहे हैं कि मैं अपने WebAppConfig क्लास में आयात कथन जोड़ता हूं लेकिन इसका मतलब यह नहीं होगा कि वास्तविक वेबपैड पर संदर्भ दो बार लोड हो गया है। हो सकता है कि मैंने टेस्ट क्लास कोड को पढ़ने कॉन्फ़िगरेशन क्लास के बजाय applicationContext.xml लोड करने के लिए कुछ करने की अपेक्षा की हो। – emeraldjava

संबंधित मुद्दे