2013-07-31 6 views
32
내 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); 
     } 

입니다 테스트하기 위해 스프링 3.2 모의 MVC를 사용하고

을 테스트 요청 매개 변수를 추가하고 내가 쓴

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

내가 너의 코드를 분석했을 때. 나는 또한 동일한 문제에 직면했지만 내 문제는 내가 성과 이름 둘 다에 가치를 부여하면 그것이 잘 작동한다는 것을 의미한다. 난 단지 줄 때 하나 개의 값은 당신의 문제는 당신이

에 코드를 변경해야 org.springframework.web.bind.missingservletrequestparameterexception 경우 400 어쨌든 오류

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")); 
} 

을 알 수 있습니다 .andDo (인쇄()) 메소드를 사용하여 말한다 의미

@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

동일한 코드를 작성했지만 modelAttribute에 문제가 있습니다. http://stackoverflow.com/questions/19427341/why-modelatribute-passed-as-null – gstackoverflow

+2

'andDo (print())'에 대한 유용한 팁이 매우 유용합니다! –

+3

메모'print()'는'MockMvcResultHandlers' 클래스의 한 메소드입니다. – WildDev

0

@ModelAttribute은 특정 객체 유형에 대한 요청 매개 변수의 Spring 매핑입니다. 따라서 매개 변수는 userClient.usernameuserClient.firstName과 같이 보일 수 있습니다. MockMvc는 브라우저에서 요청을 모방하므로 실제로 양식을 사용하여 UserClient 객체를 작성하는 매개 변수를 전달해야합니다.

(내가 ModelAttribute 모 데르의 생각은 양식에서오고가는 분야의 무리로부터 객체를 생성하는 도우미의 종류,하지만 당신은 더 나은 정의를 얻기 위해 약간의 독서를 수행 할 수 있습니다)

+0

문제가 아니기 전에 ModelAttribute를 사용했습니다. @RequestParam을 보내는 방법과 혼동했습니다. – jackyesind