我被一个控制器单元测试put方法卡住了,它总是返回一个空体响应.

下面是我的代码:

雇员服务公司.班

@Override
public Employee updateEmployee(Long id, Employee employee) {
    Employee existingEmployee = employeeRepository.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException("employee with id: " + id + " does not exist."));

    existingEmployee.setFirstName(employee.getFirstName());
    existingEmployee.setLastName(employee.getLastName());
    existingEmployee.setEmail(employee.getEmail());

    return employeeRepository.save(existingEmployee);
}

雇员控制员.具有@RequestMapping("/api/employees")的类

@PutMapping("/{id}")
public ResponseEntity<Employee> updateEmployee(@PathVariable Long id, @RequestBody Employee employee) {
    return new ResponseEntity<>(employeeService.updateEmployee(id, employee), HttpStatus.OK);
}

员工控制测试.班

@Test
public void givenUpdatedEmployee_whenUpdateEmployee_thenReturnUpdatedEmployee() throws Exception {

    Long employeeId = 1L;

    Employee savedEmployee = Employee.builder()
            .id(employeeId)
            .firstName("Jay")
            .lastName("Lai")
            .email("jay@gmail.com")
            .build();

    Employee updatedEmployee = Employee.builder()
            .id(employeeId)
            .firstName("Jayyy")
            .lastName("Laiii")
            .email("jayyy@gmail.com")
            .build();

    BDDMockito.given(employeeService.getEmployeeBYId(employeeId))
            .willReturn(savedEmployee);

    BDDMockito.given(employeeService.updateEmployee(employeeId, updatedEmployee))
            .willReturn(updatedEmployee);

    ResultActions response = mockMvc.perform(MockMvcRequestBuilders.put("/api/employees/{id}", employeeId)
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsString(updatedEmployee)));


    response.andDo(MockMvcResultHandlers.print())
            .andExpect(MockMvcResultMatchers.jsonPath("$.firstName", CoreMatchers.is(updatedEmployee.getFirstName())))
            .andExpect(MockMvcResultMatchers.jsonPath("$.lastName", CoreMatchers.is(updatedEmployee.getLastName())))
            .andExpect(MockMvcResultMatchers.jsonPath("$.email", CoreMatchers.is(updatedEmployee.getEmail())));
}

这是输出.

我真的不明白我错过了什么,任何帮助都将不胜感激,谢谢.

MockHttpServletRequest:
  HTTP Method = PUT
  Request URI = /api/employees/1
   Parameters = {}
      Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"73"]
         Body = {"id":1,"firstName":"Jayyy","lastName":"Laiii","email":"jayyy@gmail.com"}
Session Attrs = {}

Resolved Exception:
         Type = null

ModelAndView:
    View name = null
         View = null
        Model = null

FlashMap:
   Attributes = null

MockHttpServletResponse:
       Status = 200
Error message = null
      Headers = []
 Content type = null
         Body = 
Forwarded URL = null
   Redirected URL = null
      Cookies = []

**java.lang.AssertionError: No value at JSON path "$.firstName"**

推荐答案

问题就在这里

BDDMockito.given(employeeService.updateEmployee(employeeId, updatedEmployee))

因为你的PUT请求主体通过控制器是JSON,而不是Employee.

你应该把你的given...when...条语句修改为

BDDMockito.given(employeeService.updateEmployee(eq(employeeId), any()))

然后它就会正常工作.

Java相关问答推荐

在AnyLogic中增加变量计数

编译多个.Java文件并运行一个依赖于用户参数的文件

计算两个浮点数之间的距离是否对称?

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

声明带有泛型的函数以用作查找映射中的值

%This内置函数示例

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

将双倍转换为百分比

如何在运行docker的应用程序中获取指定的配置文件

为什么我不能建立输入/输出流?Java ServerSocket

在Java Spring JPA中插入包含对其他实体的引用的列

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

URI构造函数错误?

java.util.LinkedList()是如何成为MutableList的实例的?

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

UuidGenerator Bean 类型不匹配?

如何使用 Java 替换位于特定标记内的 XML 标记的 CDATA 内的值