2014-05-20 9 views
5

के साथ मॉकिटो का उपयोग करते समय मैं अपने पैरों को टीडीडी के साथ गीला करने की कोशिश कर रहा हूं। मैं MockMvc और Junit के संयोजन के साथ Mockito का उपयोग कर नियंत्रकों के लिए इकाई परीक्षण मामलों को लिखने की कोशिश कर रहा हूँ।java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() जूनिट

लेकिन मुझे रनटाइम त्रुटि मिल रही है जिससे मेरा परीक्षण विफल हो रहा है। सबसे पहले मुझे javax.servlet.SessionCookieConfig खोजने में विफलता के कारण सेटअप में MockMvc इंस्टेंस प्रारंभ करने में समस्या का सामना करना पड़ रहा था।

यह मैं javax.servlet एपीआई को डाउनलोड करने और इस परियोजना के निर्माण के रास्ते में यह विन्यस्त करने लेकिन जब MockMvc उदाहरण पर perform() का उपयोग कर तो मैं

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() 

का सामना करना पड़ रहा द्वारा हल।

क्या कोई मुझे बता सकता है कि इस तरह की निर्भरताओं के साथ क्या करना है क्योंकि मुझे लगता है कि यह असंगत सर्वर सर्वलेट-एपीआई और javax.servlet api के कारण होता है।

संपादित करें: मैं कोड मैं इकाई परीक्षण के लिए उपयोग कर उपयोग कर रहा हूँ पोस्टिंग कर रहा हूँ, लेकिन मुझे नहीं लगता कि यह किसी भी मदद लेकिन सिर्फ मामले में होगा: बहुत ज्यादा है जैसे आप गलत है

@RunWith(MockitoJUnitRunner.class) 
public class MyControllerTest { 

    @InjectMocks 
    private MyController myController = new MyController(); 

    @Mock 
    private MyService myService = new MyServiceImpl(); 

    private MockMvc mockMvc; 

    @Before 
    public void setUp(){ 
     this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build(); 
    } 

    @Test 
    public void testList() throws Exception{ 
     A a = new A(); 
     a = createMockClassA(); 

     Mockito.when(myService.getServiceForA(Mockito.anyMapOf(String.class, String.class))).thenReturn(a); 

     MvcResult result = this.mockMvc.perform(get("/somePath/")).param("someExpectedParam","value").andReturn(); 

     System.out.println(result.getResponse().getContentAsString()); 

    } 



    private static A createMockClassA(){ 
     A a = new A(); 
     a.setId(i); 
     a.setTitle("mock-" + i); 
     return a; 
    } 
} 

उत्तर

7

यह लगता है कक्षा पथ में सर्वलेट एपीआई का संस्करण।

एपीआई में isAsyncStarted जोड़ा गया था और यह सुनिश्चित करें कि आपके क्लासपाथ में संदर्भित कोई भी व्यक्ति कम से कम उस संस्करण या उच्चतर है।

आदेश स्थान जहां 'गलत' वर्ग संस्करण आप जावा के लिए

-verbose:class 

तर्क का उपयोग कर सकते से आ रहा है खोजने के लिए। यह लोड की गई सभी कक्षाओं को सूचीबद्ध करेगा और यदि मुझे सही ढंग से याद आती है तो वे लोड हो जाते हैं। विवरण के लिए http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html देखें।

+0

हाय जेन्स, मैं एपीआई isAsyncStarted सर्वलेट 3.0 में जोड़ दिया गया है की जाँच की और मैं अपने प्रोजेक्ट निर्माण में java.servlet-3.0.jar उपयोग कर रहा हूँ। – Sourabh

+0

विकास के लिए ठीक है। जांचें कि सर्वर एक ही सर्वलेट एपीआई स्तर का उपयोग कर रहा है या नहीं। –

+0

सर्वर एक ही सर्वलेट एपीआई स्तर का है। – Sourabh

1

ऐसा तब होता है जब आपका विकास और उत्पादन वातावरण विभिन्न सर्वलेट एपीआई संस्करणों का उपयोग कर रहे हैं।

tomcat7 के साथ निर्माण करते समय (उदाहरण के लिए) यह सर्वलेट 3 का समर्थन करता है और इसलिए आपको कोई त्रुटि नहीं मिलेगी।

निम्न संस्करण टोमकैट पर ऐसा करने के दौरान, यह त्रुटि फेंक देगा।

समाधान:

या तो वातावरण में से एक उन्नयन सर्वलेट 3 का समर्थन करने के लिए या सिर्फ सर्वलेट उपयोग करने के लिए 2.5

+0

हाय मनीष, मैंने सोचा लेकिन चौंकाने वाला मैं अपाचे टॉमकैट 7.0.40 और javax.servlet-3.0.jar का उपयोग कर रहा हूं। मैं javax servlet को 2.5 तक डाउनग्रेड नहीं कर सकता क्योंकि इसमें सत्रक्यूकी कॉन्फिग क्लास शामिल नहीं है। तो टोमकैट को अपग्रेड करना एक विकल्प होगा लेकिन यह पहले से ही संगत संस्करण पर है। – Sourabh

0

मैं अपने त्रुटि के लिए समाधान के लिए अपने कोड डाउनग्रेड करें। प्रदान की जा रही वास्तविक सर्वलेट एपीआई gwt-servlet.jar और gwt-servlet.jar में servlet-api का पुराना संस्करण था। इस प्रकार मैंने निर्माण के दौरान प्रोजेक्ट पॉइंट को नवीनतम सर्वलेट-एपीआई बनाने के लिए अपना निर्माण पथ कॉन्फ़िगर किया था।

सही उत्तर के लिए, मुझे लगता है कि मेरा वोट जेन्स में जाता है क्योंकि उसने परिदृश्य के अनुसार समाधान को निकटतम दिया है।

सभी को धन्यवाद। :)

+0

धन्यवाद। यह किसी भी मुद्दे के बिना servlet-api.jar 3.0.1 के साथ काम करता है। – rakeeee

1

त्रुटि संदेश इंगित करता है कि आपके क्लासपाथ में Servlet API का गलत संस्करण है।

आप निष्पादित

gradle dependencies 

निर्भरता वृक्ष का विश्लेषण और संस्करण 3.0 की तुलना में कम के साथ 'सर्वलेट-api' निर्भरता को बाहर Gradle उपयोग कर रहे हैं। आप निम्नलिखित को बाहर करने के

compile ('javax.servlet:jsp-api:2.0'){ 
    exclude module : 'servlet-api' 
} 

कई निर्भरता जो आगे सर्वलेट-api-2.x शामिल नहीं हो सकता है कर सकते हैं। बाहर निकालें उन सभी

+0

धन्यवाद, यह मेरे मामले में समाधान था। org.apache: तूफान-कोर servlet-api 2.5 का उपयोग करता है लेकिन io.confluent: kafka-schema-रजिस्ट्री servlet-api 3.1 का उपयोग करता है। मुझे अपना कोड काम करने के लिए तूफान से निर्भरता को बाहर करना पड़ा। – asmaier

0

मैं (विचार IntelliJ में)

mockito javax.servlet.SessionCookieConfig problem

0

मैं अपने JUnit परीक्षण की एक ऐसी ही मुद्दा कुछ था एक सर्वर क्रम पुस्तकालय से काम नहीं कर रहे थे के रूप में जावा का निर्माण पथ बिल्ला को जोड़कर इस समस्या का समाधान और मुझे उन यूनिट परीक्षणों के लिए java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.... भी मिल रहा था। जब मैं gradle clean build कमांड का उपयोग कर कमांड प्रॉम्प्ट के माध्यम से निर्देशिका से ग्रेडल का उपयोग करके पूरी परियोजना को संकलित करने का प्रयास करता हूं तो कोड सफलतापूर्वक संकलित किया जा रहा था। जबकि इंटेलिज विचार में जूनिट परीक्षणों के साथ समस्या थी, वे उपर्युक्त त्रुटि दिखा रहे थे। मैंने बस अपना ग्रेडल संस्करण 3.4.1 से 2.1.3 में बदल दिया। मुझे नहीं पता कि अब मेरे जूनिट परीक्षण क्यों संकलित हैं और साथ ही मेरा कोड इंटेलिज के साथ-साथ कमांड प्रॉम्प्ट के माध्यम से संकलित किया जा रहा है। मेरी समस्या के एक अन्य सहयोगी के साथ एक ही समस्या आई और उसने भी 4 से कुछ संस्करणों में धीरे-धीरे संस्करण को बदल दिया। समस्या हल हो गई।

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