jUnit with Spring MVC returns a 400 instead a 200

7.1k views Asked by At

I am trying to do testing for my mvc controllers so I know they are working properly. I will post all the code first and then explain what is happening:

My Controller

@RequestMapping(value ="Residents/create", method=RequestMethod.POST)
public ResponseEntity<Object> createNewResident(@RequestBody Resident 
resident){
    Apartment apartment = apartmentService.findByApartmentId(167);
    resident.setApartment(apartment);
    System.out.println("slack api");

    String requestUrl = "SlackStringThatIChanged" +"&email=" +resident.getEmail() +
    "&first_name=" + resident.getFirstName() + "&last_name=" + resident.getLastName();
    try {
    URL url = new URL(requestUrl);
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("GET");

    //View Slack response
    /*BufferedReader br = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line + "\n");
        System.out.println(line);
    }
    br.close();
    */
    } catch (ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return ResponseEntity.ok(residentService.createResident(resident) );
}

My Test method

@Test//this still has problems with the apartment...
public void createNewResidentTest() throws Exception {

    apartmentComplex = new ApartmentComplex();
    apartmentComplex.setComplexId(1);
    apartmentComplex.setAddress("1234 theAddress");
    apartmentComplex.setEmail("[email protected]");
    apartmentComplex.setName("westerly");
    apartmentComplex.setPhone("8548");
    apartmentComplex.setWebsite("www.serwtet.com");
    apartmentComplex.setPhoto("weewtfsw");


    apartment = new Apartment();
    apartment.setApartmentId(1);
    apartment.setApartmentNumber(101);
    apartment.setCapacity(6);
    apartment.setOccupancy(3);

    List<Apartment> apt = new ArrayList<>();
    apt.add(apartment);
    apartmentComplex.setApartments(apt);


    resident = new Resident();
    resident.setResidentId(1);
    resident.setFirstName("Cool");
    resident.setLastName("Man");
    resident.setEmail("[email protected]");
    resident.setPhone("548791234");
    resident.setSlackId("32f4443rwd");
    resident.setAbout("Yeah boi");
    resident.setApartment(apartment);

    Set<Resident> resLis = new HashSet<Resident>();
    resLis.add(resident);
    apartment.setResidents(resLis);

    mvc.perform(MockMvcRequestBuilders.post("http://localhost:8181/api/Residents/create", resident)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
}

So, I am trying to test that controller that creates a resident. I was first getting an error that said something like "reference is nullpointerexception" which I figured out it was due that resident is staying in an apartment and an apartment exist in the apartment complex. After fixing this error I stumble upon "Status excepted <200> but was <400>" and in the console output I get this:

MockHttpServletRequest:
  HTTP Method = POST
  Request URI = /api/Residents/create
   Parameters = {}
      Headers = {Accept=[application/json]}

Handler:
         Type = com.application.controller.ResidentController
       Method = public org.springframework.http.ResponseEntity<java.lang.Object> com.application.controller.ResidentController.createNewResident(com.application.model.Resident)

Async:
Async started = false
 Async result = null

Resolved Exception:
         Type = org.springframework.http.converter.HttpMessageNotReadableException

ModelAndView:
    View name = null
         View = null
        Model = null

FlashMap:
   Attributes = null

I really don't know what is happening or what could be the problem. Maybe I am implementing the test wrong?

Please let me know any thought you have! Thank you.

1

There are 1 answers

5
Sean Carroll On BEST ANSWER

What about something like the following?

@Test//this still has problems with the apartment...
public void createNewResidentTest() throws Exception {

    Resident resident = new Resident();
    // build resident
    // convert to json string
    mvc.perform(MockMvcRequestBuilders.post("/api/Residents/create")
            .contentType(MediaType.APPLICATION_JSON)
            .content(json)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
}