2013-07-31 11 views
32

मैं वसंत 3.2 नकली MVC उपयोग कर रहा हूँ परीक्षण करने के लिए मेरी controller.My कोडनकली MVC -

@Autowired 
    private Client client; 

    @RequestMapping(value = "/user", method = RequestMethod.GET) 
     public String initUserSearchForm(ModelMap modelMap) { 
      User user = new User(); 
      modelMap.addAttribute("User", user); 
      return "user"; 
     } 

     @RequestMapping(value = "/byName", method = RequestMethod.GET) 
     @ResponseStatus(HttpStatus.OK) 
     public 
     @ResponseBody 
     String getUserByName(@RequestParam("firstName") String firstName, 
           @RequestParam("lastName") String lastName, @ModelAttribute("userClientObject") UserClient userClient) { 

      return client.getUserByName(userClient, firstName, lastName); 
     } 

है परीक्षण करने के लिए अनुरोध पैरामीटर जोड़ें और परीक्षण निम्नलिखित मैं ने लिखा है:

@Test 
public void testGetUserByName() throws Exception { 
     String firstName = "Jack"; 
     String lastName = "s";  
     this.userClientObject = client.createClient(); 
     mockMvc.perform(get("/byName") 
       .sessionAttr("userClientObject", this.userClientObject) 
       .param("firstName", firstName) 
       .param("lastName", lastName)    
     ).andExpect(status().isOk()) 
       .andExpect(content().contentType("application/json")) 
       .andExpect(jsonPath("$[0].id").exists()) 
       .andExpect(jsonPath("$[0].fn").value("Marge")); 

} 

मैं क्या मिलता है

java.lang.AssertionError: Status expected:<200> but was:<400> 
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60) 
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89) 
    at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:546) 
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141) 

ऐसा क्यों होता है? क्या @RequestParam

उत्तर

45

जब मैंने आपके कोड का विश्लेषण किया। मुझे भी एक ही समस्या का सामना करना पड़ा है लेकिन मेरी समस्या यह है कि अगर मैं पहले और आखिरी नाम दोनों के लिए मूल्य देता हूं तो इसका मतलब है कि यह ठीक काम कर रहा है। लेकिन जब मैं केवल देना एक मूल्य का मतलब यह कहता है कि 400 वैसे भी .andDo (प्रिंट()) पद्धति का उपयोग त्रुटि

public void testGetUserByName() throws Exception { 
    String firstName = "Jack"; 
    String lastName = "s";  
    this.userClientObject = client.createClient(); 
    mockMvc.perform(get("/byName") 
      .sessionAttr("userClientObject", this.userClientObject) 
      .param("firstName", firstName) 
      .param("lastName", lastName)    
    ).andDo(print()) 
    .andExpect(status().isOk()) 
      .andExpect(content().contentType("application/json")) 
      .andExpect(jsonPath("$[0].id").exists()) 
      .andExpect(jsonPath("$[0].fn").value("Marge")); 
} 

पता लगाने के लिए अगर आपकी समस्या org.springframework.web.bind.missingservletrequestparameterexception है आप

करने के लिए अपने कोड बदलना होगा
@RequestMapping(value = "/byName", method = RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public 
    @ResponseBody 
    String getUserByName(@RequestParam(value="firstName",required = false) String firstName, 
          @RequestParam(value="lastName",required = false) String lastName, @ModelAttribute("userClientObject") UserClient userClient) { 

     return client.getUserByName(userClient, firstName, lastName); 
    } 
+0

भेजने के तरीके से उलझन में आया है, लेकिन मैंने मॉडल एट्रिब्यूट के साथ समस्या है। कृपया http://stackoverflow.com/questions/19427341/why-modelatribute-passed-as-null – gstackoverflow

+2

'और डीओ (प्रिंट()) पर बहुत अच्छी युक्ति पढ़ें, बहुत उपयोगी! –

+3

एक नोट लें, 'प्रिंट() '' MockMvcResultHandlers' वर्ग का एक तरीका है – WildDev

0

@ModelAttribute किसी विशेष ऑब्जेक्ट प्रकार के अनुरोध पैरामीटर का स्प्रिंग मैपिंग पास करने का सही तरीका है। इसलिए आपके पैरामीटर userClient.username और userClient.firstName इत्यादि की तरह लग सकते हैं क्योंकि MockMvc ब्राउज़र से अनुरोध का अनुकरण करता है, आपको पैरामीटर में पारित करने की आवश्यकता होगी जो वास्तव में UserClient ऑब्जेक्ट बनाने के लिए एक फॉर्म से उपयोग करेगा।

(i ModelAttribute के बारे में सोच सहायक क्षेत्रों है कि एक रूप से में आने के लिए जा रहे हैं के एक समूह से एक वस्तु के निर्माण के लिए की तरह है, लेकिन आप एक बेहतर परिभाषा पाने के लिए कुछ पढ़ने क्या करना चाहते हो सकता है)

+0

मैंने मॉडल एट्रिब्यूट का उपयोग किया था इससे पहले कि कोई समस्या नहीं थी। मुझे @RequestParam – jackyesind