2013-07-31 20 views
32

Sto usando la primavera 3.2 MVC finta di testare il mio codice controller.My èMock MVC - Aggiungi Richiesta parametri per testare

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

e ho scritto seguente test:

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

} 

ciò che ottengo è

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) 

Perché questo accade? È giusto per passare il @RequestParam

risposta

45

Quando ho analizzato il tuo codice. Ho anche affrontato lo stesso problema ma il mio problema è che se do un valore sia al nome che al cognome significa che funziona bene. ma quando do un solo valore significa che dice 400. comunque utilizzare il metodo .andDo (print()) per scoprire l'errore

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

Se il vostro problema è org.springframework.web.bind.missingservletrequestparameterexception si deve modificare il codice per

@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

Ho scritto lo stesso codice, ma ho problemi con modelAttribute. per favore leggi http://stackoverflow.com/questions/19427341/why-modelatribute-passed-as-null – gstackoverflow

+2

Un ottimo consiglio su 'andDo (print())', molto utile! –

+3

Prendi nota, 'print()' è un metodo della classe 'MockMvcResultHandlers' – WildDev

0

@ModelAttribute è una mappatura Spring dei parametri di richiesta per un particolare tipo di oggetto. quindi i tuoi parametri potrebbero sembrare userClient.username e userClient.firstName, ecc. poiché MockMvc imita una richiesta da un browser, dovrai passare i parametri che Spring userebbe da un modulo per costruire effettivamente l'oggetto UserClient.

(penso a ModelAttribute è una specie di aiuto per costruire un oggetto da un gruppo di campi che stanno per entrare in forma, ma si consiglia di fare qualche lettura per ottenere una migliore definizione)

+0

Ho usato ModelAttribute prima che non fosse un problema. Ho confuso con come inviare @RequestParam – jackyesind