为了账号安全,请及时绑定邮箱和手机立即绑定

如何将@WebMvcTest 用于单元测试 POST 方法?

如何将@WebMvcTest 用于单元测试 POST 方法?

不负相思意 2021-11-03 15:20:41
我正在使用 Spring Boot 和 Mockito 运行单元测试,我正在测试 RESTful 服务。当我尝试测试 GET 方法时,它成功运行,但是当我尝试测试 POST 方法时,它失败了。我应该怎么做才能解决这个问题?提前致谢!这是 REST 控制器的代码:package com.dgs.restfultesting.controller;import java.net.URI;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import com.dgs.restfultesting.business.ItemBusinessService;import com.dgs.restfultesting.model.Item;@RestControllerpublic class ItemController {    @Autowired    private ItemBusinessService businessService;    @GetMapping("/all-items-from-database")    public List<Item> retrieveAllItems() {        return businessService.retrieveAllItems();     }    @PostMapping("/items")    public Item addItem(@RequestBody Item item) {        Item savedItem = businessService.addAnItem(item);         return savedItem;    }}业务层:package com.dgs.restfultesting.business;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.dgs.restfultesting.data.ItemRepository;import com.dgs.restfultesting.model.Item;@Componentpublic class ItemBusinessService {    @Autowired    private ItemRepository repository;    public Item retrieveHardcodedItem() {        return new Item(1, "Book", 10, 100);     }    public List<Item> retrieveAllItems() {        List<Item> items = repository.findAll();         for (Item item : items) {            item.setValue(item.getPrice() * item.getQuantity());          }        return items;      }    public Item addAnItem(Item item) {        return repository.save(item);     }}
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

从您的控制器返回 201:正如您的断言测试期望201使用created状态一样,但您的控制器返回 200(OK)。


   @PostMapping("/items")

    public ResponseEntity<?> addItem(@RequestBody Item item) {

        Item savedItem = itemBusinessService.addAnItem(item);


        return new ResponseEntity<>(savedItem, HttpStatus.CREATED);

    }

或者修改您的测试以检查状态 OK(200)。如果您不想断言“位置”,请更新您的测试。


 @Test

 public void createItem() throws Exception {

 RequestBuilder request = MockMvcRequestBuilders

        .post("/items")

        .accept(MediaType.APPLICATION_JSON)

        .content("{\"id\":1,\"name\":\"Book\",\"price\":10,\"quantity\":100}")

        .contentType(MediaType.APPLICATION_JSON);


MvcResult result = mockMvc.perform(request)

        .andExpect(status().isOk()).andReturn();

}

更新--允许位置标头作为响应


如果您希望“位置”从标题返回,请修改您的控制器和下面的测试用例以在标题中检查位置。


第 1 步:在您的控制器的 add item 方法中,添加位置 uri 并返回。


 @PostMapping("/items")

    public ResponseEntity<?> addItem(@RequestBody Item item) {

        Item savedItem = businessService.addAnItem(item);

        HttpHeaders httpHeaders = new HttpHeaders();

        UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.newInstance();


        UriComponents uriComponents =

                uriComponentsBuilder.path("/item/").buildAndExpand("/item/");

        httpHeaders.setLocation(uriComponents.toUri());

        return new ResponseEntity<>(savedItem, httpHeaders, HttpStatus.CREATED);

    }

第 2 步:现在您的测试将"location"按照您的预期进行断言。


 @Test

    public void createItem() throws Exception {

        RequestBuilder request = MockMvcRequestBuilders

                .post("/items")

                .accept(MediaType.APPLICATION_JSON)

                .content("{\"id\":1,\"name\":\"Book\",\"price\":10,\"quantity\":100}")

                .contentType(MediaType.APPLICATION_JSON);


        MvcResult result = mockMvc.perform(request)

                .andExpect(status().isCreated())

                .andExpect(header().string("location", containsString("/item/")))

                .andReturn();

    }


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信