具有单元测试的Spring Boot测试API端点应返回404而不是400

时间:2020-01-24 14:34:35

标签: java spring mongodb spring-boot unit-testing

我的Spring Boot应用程序中具有以下控制器,该控制器已连接到MongoDB

@RestController
@RequestMapping("/experts")
class ExpertController {
    @Autowired
    private  ExpertRepository repository;


    @RequestMapping(value = "/", method = RequestMethod.GET)
    public List<Experts> getAllExperts() {
        return repository.findAll();
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Experts getExpertById(@PathVariable("id") ObjectId id) {
        return repository.findBy_id(id);
    }

我正在尝试在测试中测试get/id端点,我希望它会返回如下所示的404响应:

 @Test
    public void getEmployeeReturn404() throws Exception {
        ObjectId id = new ObjectId();
        mockMvc.perform(MockMvcRequestBuilders.get("/experts/999", 42L)
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isNotFound());

    }

尽管如此,返回的响应是400,这意味着我的请求格式不正确。我猜问题出在我要在URI上输入的id上?我知道mongo接受hexStrings作为主键,所以我的问题是,如何在我的数据库中不存在的URI上使用id,以便可以返回404响应?预先感谢您的回答。

2 个答案:

答案 0 :(得分:0)

"/experts/999", 42L

这不是objectId。

尝试类似

 mockMvc.perform(MockMvcRequestBuilders.get("/experts/58d1c36efb0cac4e15afd278")
 .contentType(MediaType.APPLICATION_JSON)
 .accept(MediaType.APPLICATION_JSON))
 .andExpect(MockMvcResultMatchers.status().isNotFound());

答案 1 :(得分:0)

对于urlVariables,您需要:

@Test
public void getEmployeeReturn404() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/experts/{id}", 42L)
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isNotFound());

}

42L是您的 {id} PathVariable值。