我正在尝试测试在服务类中返回 ResponseEntity<> 的 POST 方法:
public ResponseEntity<Customer> addCustomer(Customer customer) {
[validation etc...]
return new ResponseEntity<>(repository.save(customer), HttpStatus.OK);
}
我在做什么:
@Test
public void addCustomer() throws Exception {
String json = "{" +
"\"name\": \"Test Name\"," +
"\"email\": \"[email protected]\"" +
"}";
Customer customer = new Customer("Test Name", "[email protected]");
when(service.addCustomer(customer))
.thenReturn(new ResponseEntity<>(customer, HttpStatus.OK));
this.mockMvc.perform(post(CustomerController.URI)
.contentType(MediaType.APPLICATION_JSON)
.content(json)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").exists())
.andExpect(jsonPath("$.name", is("Test Name")))
.andExpect(jsonPath("$.email", is("[email protected]")))
.andExpect(jsonPath("$.*", hasSize(3)))
.andDo(print());
}
当我运行我收到的测试时:
java.lang.AssertionError: No value at JSON path "$.id"
并且 Status = 200。据我了解,Mockito 没有返回该对象。其他方法(如 GET)工作得很好,但它们返回对象,而不是 ResponseEntity<>。我做错了什么以及如何解决?
问题是你在测试代码中创建了一个
Customer
,这个Customer
与生产代码中的Customer
不同。
所以Mockito无法匹配两个
Customer
,导致when/thenReturn
表达式失败。因此 service.addCustomer
返回 null
并且你会在测试结果中得到 AssertionError 。
您可以使用
any()
匹配器来解决这个问题:
when(service.addCustomer(any())).thenReturn(.....);
问题在于对 Customer 对象中
id
字段的检查。
您需要做的就是将其添加到创建的 JSON 中,然后在您的
Customer
初始化中您可以添加相同的 id。
或者,如果您在
ID
对象中自动生成 Customer
,则可以检查 ID
是否不为空。在这种情况下,我建议创建一个 MockCustomerFactory
,在其中创建一个用于测试目的的模拟对象并检查您期望的字段,尽管这只是一个“快乐流程”测试用例。
模拟客户工厂示例:
public class MockCustomerFactory {
public static Customer create() {
Customer customer = new Customer();
customer.id = "customerId";
customer.name = "customerName";
customer.email = "[email protected]";
return customer;
}
}
将其注入到您的测试用例和其他用例中,以使测试对象更容易。