2016-04-12 8 views
9

के माध्यम से परीक्षण फ़ॉर्म पोस्ट परीक्षण मैं यह सत्यापित करने के लिए परीक्षण लिख रहा हूं कि मैं अपने एपीआई में एक सामान्य फॉर्म पोस्ट कर सकता हूं।MockMVC

मैंने कुछ डीबगिंग भी जोड़ा है, लेकिन मैंने देखा कि वास्तविक रूप से पोस्ट किया गया डेटा; (डाकिया/AngularJS या w/ई) की तरह एक mockMVC परीक्षण कर से अलग है:

MvcResult response = mockMvc 
      .perform(post("/some/super/secret/url") // 
        .param("someparam1", "somevalue") // 
        .param("someparam2", "somevalue") //     
        .contentType(MediaType.APPLICATION_FORM_URLENCODED) // 
        .accept(MediaType.APPLICATION_JSON)) // 
      .andExpect(status().isOk()) // 
      .andReturn(); 

config वास्तव में उत्पादन में चल config, और इस तरह के रूप में ही है। मेरी इंटरसेप्टर सामग्री, असली परीक्षा (नहीं mockMVC) में लॉग हालांकि जब सामग्री की तरह "someparam1 = somevalue & आदि = दोहराना" स्वरूपित है

जब मैं mockMVC सामग्री मुद्रित मैं वास्तव में कोई सामग्री है लगता है, लेकिन देखते हैं अनुरोध में पैरा, मुझे लगता है कि वे जीईटी पैरामीटर की तरह जोड़े गए हैं।

कोई भी जानता है कि इसका सही तरीके से परीक्षण कैसे किया जाए? मैं इस मुद्दे पर आया क्योंकि ऐसा लगता है कि हमारे फॉर्म पोस्ट स्प्रिंग द्वारा पार्स किए जाने लगते हैं, भले ही हमारे पास FormHttpMessageConverter को सर्वलेट संदर्भ में जोड़ा गया हो।

+0

आप और अधिक विस्तार प्रदान कर सकते हैं, config की तरह, वास्तविक डेटा आप सर्वर और कुछ लॉग विस्तार के लिए पोस्ट यह और अधिक स्पष्ट बनाने के लिए? नकली के बारे में, ऐसा लगता है कि आप सही कर रहे हैं, नकली परीक्षण का परम आपके द्वारा दिखाए गए पोस्ट डेटा का एक ही प्रकार का प्रारूप है। साथ ही, जांच करें कि क्या आपको कुछ वसंत सुरक्षा की तरह लगता है। आपको अगले चरण करने से पहले वसंत सुरक्षा का नकल करना या लॉगिन करना पड़ सकता है। –

+1

हम इस तरह कुछ भी उपयोग नहीं करते हैं, जो मुझे पता चला है कि मेरा उदाहरण वास्तव में गलत है। इस मामले में कुछ पैराम 1 और कुछ पैराम 2 एक प्रश्न सर्वोपर होंगे, (यूआरएल में)। मैं फॉर्म पैराम्स का उपयोग इसलिए करना चाहता हूं। हालांकि यह केवल मॉडल या मूल्य मानचित्र के माध्यम से सुलभ प्रतीत होता है। तो हमें एक वर्कअराउंड की आवश्यकता होगी (यह पूरी तरह वसंत एमवीसी होने के लिए माइग्रेट किया गया था, जो @ फॉर्मपाम होता था जो वसंत नहीं है)। –

+0

ओह भी पोस्ट किया गया डेटा, एमवीसी भाग के नीचे मेरे उदाहरण में था, यह एक सामग्री स्ट्रिंग को पोस्ट कर रहा है और = –

उत्तर

10

आप अपने classpath पर है, तो अपाचे HTTPComponents HttpClient, आप इसे इस तरह से कर सकते हैं:

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList(
        new BasicNameValuePair("someparam1", "true"), 
        new BasicNameValuePair("someparam2", "test") 
      ))))); 

आप HttpClient की जरूरत नहीं है, तो आप यह एक सरल सहायक विधि है कि urlencoded प्रपत्र का निर्माण के साथ कर सकते इकाई:

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(buildUrlEncodedFormEntity(
     "someparam1", "value1", 
     "someparam2", "value2" 
    )))); 

इस सहायक समारोह के साथ:

String buildUrlEncodedFormEntity(String... params) { 
    if((params.length%2)>0) { 
     throw new IllegalArgumentException("Need to give an even number of parameters"); 
    } 
    StringBuilder result = new StringBuilder(); 
    for(int i=0; i<params.length; i+=2) { 
     if(i>0) result.append('&'); 
     result.append(URLEncoder.encode(params[i]) 
      .append('=') 
      .append(URLEncoder.encode(params[i+1]); 
    } 
    return result.toString(); 
} 
+0

यह सबसे अच्छा नहीं है, लेकिन यह एक समाधान है। क्या आप मुझे बता सकते हैं कि आपको अपाचे HTTP कॉम्पोनेंट्स क्यों चाहिए?जहां तक ​​मैं इसे देख सकता हूं, बिना किसी अतिरिक्त पुस्तकालय के प्राप्त किया जा सकता है। अब के लिए एकमात्र उत्तर के रूप में मैं इसे स्वीकार करूंगा, ऐसा लगता है कि MockMVC –

+1

में परीक्षण करना मुश्किल है क्यों आपको लगता है कि मेरा समाधान अच्छा नहीं है? आपको HTTPComponents की आवश्यकता नहीं है, मैंने अभी इसका इस्तेमाल किया क्योंकि मेरे पास क्लासपाथ पर वैसे भी था। आप किसी भी पुस्तकालय का उपयोग कर सकते हैं जो एक यूआरएल एन्कोडेड फॉर्म इकाई बनाने में सक्षम है, जो 'urlencode (' name1 ') +' = '+ urlencode (value1) +' और '+ ... 'से अधिक कुछ नहीं है। –

+0

बनाने के लिए आप अपनी स्वयं की सहायक विधि लिख सकते हैं, मुझे लगता है कि मेरा मतलब है कि यह अच्छा होगा अगर mockMVC में यह कार्यान्वयन किया गया था और यह ठीक है, लेकिन यह एक कामकाज है। मजेदार मुझे लगता है कि मैंने जावा के साथ थोड़ी देर के लिए काम नहीं किया है –

1

आप coul डी मैंने बनाई गई छोटी पुस्तकालय का भी उपयोग किया: https://github.com/f-lopes/spring-mvc-test-utils/। pom.xml में

जोड़ें निर्भरता:

<dependency> 
    <groupId>io.florianlopes</groupId> 
    <artifactId>spring-mvc-test-utils</artifactId> 
    <version>1.0.1</version> 
    <scope>test</scope> 
</dependency> 

MockMvc साथ उसका उपयोग करें:

mockMvc.perform(MockMvcRequestBuilderUtils.postForm("/users", new AddUserForm("John", "Doe", null, new Address(1, "Street", 5222, "New York")))) 
    .andExpect(MockMvcResultMatchers.status().isFound()) 
    .andExpect(MockMvcResultMatchers.redirectedUrl("/users")) 
    .andExpect(MockMvcResultMatchers.flash().attribute("message", "success")); 

यह लाइब्रेरी बस मापदंडों MockMvc अनुरोध करने के लिए, प्रपत्र वस्तु के अनुसार कहते हैं।

यहाँ एक विस्तृत ट्यूटोरियल मैंने लिखा है: https://blog.florianlopes.io/tool-for-spring-mockmvcrequestbuilder-forms-tests/

+2

आप पढ़ना चाहेंगे [व्यक्तिगत ओपन-सोर्स लाइब्रेरीज़ कैसे पेश करें?] (// meta.stackexchange.com/q/229085) –

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