Я работаю над написанием тестового примера, используя MockMvc и Mokito.

Предположим, у меня есть список заказов:

{
   {
    "order_id": 1,
    "user_id": 1,
    "price": 11.0,
    "order_status": "Pending",
   },
    {
    "order_id": 2,
    "user_id": 2,
    "price": 12.0,
    "order_status": "Cancelled",
   }, 
   {
    "order_id": 3,
    "user_id": 1,
    "price": 13.0,
    "order_status": "Delivered",
   },
}

Столбец order_id является уникальным, так как я установил его как первичный ключ. Но у одного пользователя может быть несколько заказов, поэтому столбец user_id может появляться несколько раз.

Когда я попробовал конечную точку /api/order/getOrders/user/{user_id} в Postman (например, я установил user_id = 1). Ответ точно такой же, как я ожидал:

{
   {
    "order_id": 1,
    "user_id": 1,
    "price": 11.0,
    "order_status": "Pending",
   },
   {
    "order_id": 3,
    "user_id": 1,
    "price": 13.0,
    "order_status": "Delivered",
   },
}

Однако, когда я попытался написать модульный тест, используя MockMvc и Mockito. Он всегда возвращает все заказы. Вот мой код:

List<Order> orderList = new ArrayList<>();

Order order1 = new Order(1, 1, 11.0, "Pending");
Order order2 = new Order(2, 2, 12.0, "Cancelled");
Order order3 = new Order(3, 1, 13.0, "Shipped");

orderList.add(order1);
orderList.add(order2);
orderList.add(order3);

Mockito.when(orderService.getOrdersUserId(1)).thenReturn(orderList);
mockMvc.perform(MockMvcRequestBuilders.get("/api/order/getOrders/user/{user_id}", 1).contentType(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(print())
        .andExpect(jsonPath("$", hasSize(2)));

Тест не пройден, так как ответ включает все 3 элемента. Я считаю, что ошибся, используя thenReturn(orderList), но не знаю, как это исправить. Может кто-нибудь, дайте мне знать, как я могу это исправить, пожалуйста?

0
Kim Gordon 27 Сен 2022 в 20:23

1 ответ

Список заказов, который вы возвращаете, содержит все три заказа, поэтому он всегда будет возвращать их все. Если вы издеваетесь над поведением, просто добавьте заказы 1 и 3.

List<Order> orderList = new ArrayList<>();

Order order1 = new Order(1, 1, 11.0, "Pending");
Order order2 = new Order(2, 2, 12.0, "Cancelled");
Order order3 = new Order(3, 1, 13.0, "Shipped");

orderList.add(order1);
orderList.add(order3);
0
johnnyutts 27 Сен 2022 в 20:55
Итак, мы тестируем его, добавляя вручную? Есть ли у нас какие-либо решения, когда я выполняю конечные точки API, а затем получаю ответ, как я ожидаю?
 – 
Kim Gordon
27 Сен 2022 в 21:01
Да. Вы тестируете конечную точку, а не службу. Служба высмеивается, поэтому вы имитируете поведение своей службы, когда запрашиваете заказы для пользователя с идентификатором 1.
 – 
johnnyutts
27 Сен 2022 в 21:12