【问题标题】:Spring boot patch request on controller with Map parameter. Test with mockmvc带有 Map 参数的控制器上的 Spring Boot 补丁请求。用 mockmvc 测试
【发布时间】:2022-12-22 22:41:39
【问题描述】:

我正在尝试从我的 CompanyController 测试一个以 Map 和 Id 作为参数的“补丁请求”。我希望得到一个 HTTP 状态 200,但我得到一个 HTTP 状态 400。 有人可以向我解释我做错了什么吗?谢谢你

CompanyController(部分代码省略):

@RestController
public class CompanyController {

    @Autowired
    private CompanyService companyService;

    @PatchMapping("companies/{id}")
    public ResponseEntity<CompanyDTO> patchUpdateCompany(@PathVariable Integer id,
                                                         @RequestBody Map<String, Object> updates) throws JsonMappingException {

        Optional<CompanyDTO> optionalCompanyDTO = this.companyService.patchUpdateCompany(updates, id);

        return ResponseEntity.ok(optionalCompanyDTO.get());
    }

}

CompanyControllerTest(部分代码省略)

@WebMvcTest(CompanyController.class)
public class CompanyControllerTest {

    @MockBean
    private CompanyService companyService;

    @Autowired
    private MockMvc mockMvc;

    private static List<CompanyDTO> companyDTOList;

    @BeforeAll
    public static void beforeAll(){
        companyDTOList = new ArrayList<>();
        CompanyDTO companyDTO1 = CompanyDTO.builder().id(1).name("xavi").build();
        CompanyDTO companyDTO2 = CompanyDTO.builder().id(2).name("marteta").build();
        companyDTOList.add(companyDTO1);
        companyDTOList.add(companyDTO2);
    }

    @Test
    void givenMapAndIdWhenPatchUpdateCompanyThenReturnHttpStatusOk() throws Exception {
        Mockito.when(this.companyService.getCompanyById(1)).thenReturn(Optional.of(companyDTOList.get(0)));

        MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
        parameters.add("name", "xavi2");

        this.mockMvc.perform(patch("/companies/1")
            .contentType(MediaType.APPLICATION_JSON)
            .params(requestParams))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name", Matchers.is("xavi2")));

    }
}

【问题讨论】:

    标签: java testing spring-boot-test mockmvc


    【解决方案1】:

    你的问题在这里

    this.mockMvc.perform(patch("/companies/1")
                .contentType(MediaType.APPLICATION_JSON)
                .params(requestParams))  <---------------------
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", Matchers.is("xavi2")));
    
        }
    

    您将数据作为请求参数传递。但是在你的 API 中你有 @RequestBody 意味着它希望在 http 请求正文中获取数据而不是作为请求参数。

    这就是为什么您面临 400 错误意思是 Bad Request 的原因,这是由 Spring 匹配 URL 路径和 http 方法类型引起的,但您的请求中未提供 API 方法签名中的其他内容。

    所以你应该使用 .content(requestParams) 方法在你将发送的请求正文中设置你想要的内容

    Related documentation

    否则,您的 API 应该使用 @RequestParam 而不是 @RequestBody 来接收输入作为先前从测试发送的请求参数。

    【讨论】:

    • 我试过 .content,但它一直返回 400。我把 .content(String.valueOf(requestParams)))
    【解决方案2】:

    你解决了吗?我有同样的问题

    【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2017-07-10
    • 2014-02-06
    • 2014-05-31
    相关资源
    最近更新 更多