带有 Spring MVC returns 的 jUnit 是 400 而不是 200

jUnit with Spring MVC returns a 400 instead a 200

我正在尝试对我的 mvc 控制器进行测试,以便我知道它们工作正常。我会先 post 所有代码,然后再解释发生了什么:

我的控制器

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

我的测试方法

@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("some@email.com");
    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("coolman@cool.com");
    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());
}

所以,我正在尝试测试创建居民的控制器。我首先收到一个错误,上面写着 "reference is nullpointerexception" 之类的内容,我想这是因为居民住在公寓里,而公寓大楼里有一间公寓。修复此错误后,我偶然发现 "Status excepted <200> but was <400>" 并在控制台输出中得到:

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

我真的不知道发生了什么或者可能是什么问题。也许我执行的测试有误?

请让我知道您的任何想法!谢谢。

像下面这样的事情呢?

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