在Spring中测试返回ResponseEntity<>的POST方法

问题描述 投票:0回答:2

我正在尝试测试在服务类中返回 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<>。我做错了什么以及如何解决?

java spring junit mockito spring-test
2个回答
0
投票

问题是你在测试代码中创建了一个

Customer
,这个
Customer
与生产代码中的
Customer
不同。

所以Mockito无法匹配两个

Customer
,导致
when/thenReturn
表达式失败。因此
service.addCustomer
返回
null
并且你会在测试结果中得到 AssertionError 。

您可以使用

any()
匹配器来解决这个问题:

when(service.addCustomer(any())).thenReturn(.....);

0
投票

问题在于对 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;
    }
}

将其注入到您的测试用例和其他用例中,以使测试对象更容易。

© www.soinside.com 2019 - 2024. All rights reserved.