首页 > 解决方案 > 当返回类型为响应实体时测试控制器类 post 方法

问题描述

下面的代码使用 testng 和 mockito 测试一个 post 方法。我在 assertThat(outputInJson).isEqualTo(inputInJson) 行遇到错误。控制器类 post 方法在创建商品时返回 responseEntity 对象。

    @Test
public void testCreateOffer() throws Exception {
    Offer offer = new Offer("SE", new Date(), 10);

    MockHttpServletRequest request = new MockHttpServletRequest();
    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{jobTitle}")
            .buildAndExpand(offer.getJobTitle()).toUri();

    String inputInJson = this.mapToJson(ResponseEntity.created(location).build());
    Mockito.when(offerService.createOffer(Mockito.any(Offer.class))).thenReturn(offer);

    RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/offers").accept(MediaType.APPLICATION_JSON)
            .content(inputInJson).contentType(MediaType.APPLICATION_JSON);

    MvcResult result = mockMvc.perform(requestBuilder).andReturn();

    MockHttpServletResponse response = result.getResponse();

    String outputInJson = response.getContentAsString();

    assertThat(outputInJson).isEqualTo(inputInJson);

    assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());

}

private String mapToJson(Object object) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.writeValueAsString(object);
}

和控制器类 post 方法

@PostMapping("/offers")

public ResponseEntity<Object> createOffer(@Valid @RequestBody Offer offer) {
    Offer uoffer = offerService.createOffer(offer);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{jobTitle}")
            .buildAndExpand(uoffer.getJobTitle()).toUri();

    return ResponseEntity.created(location).build();

}

标签: spring-boottestng

解决方案


推荐阅读