当原始代码可以正常工作时,为什么我的单元测试没有通过?

时间:2020-07-16 17:37:26

标签: spring-boot unit-testing mockito repository junit5

即使初始代码有效,我的单元测试仍继续发送错误消息,而我以相同的方式编写了其他单元测试,并且它们运行良好。

初始代码:

@Override
    public void newOrder(OrderVO orderVO) {

        OrderProduct orderProduct = new OrderProduct();

        Optional<User> userResponse = userRepository.findById(orderVO.getUserId());
        User user = userResponse.orElse(new User());
        Orders order = new Orders(user);
        orderRepository.save(order);

        orderProduct.setId(new OrderProductId());
        orderProduct.setOrders(order);

        List<ProductVO> productVOS = orderVO.getOrderProducts();
        for (ProductVO p : productVOS) {

            Optional<Product> productResponse = productRepository.findById(p.getId());
            Product product = productResponse.orElse(new Product());
            product.setAmount(product.getAmount() - p.getAmountOfOrderedProducts());
            product.setUser(user);
            productRepository.save(product);

            orderProduct.setProduct(product);
            orderProduct.setAmountOfOrderedProduct(p.getAmountOfOrderedProducts());
            orderProductRepository.saveOrder(orderProduct.getProduct().getId(), orderProduct.getOrders().getId(), orderProduct.getAmountOfOrderedProduct());
        }
    }

测试:

@Test
    void newOrder() {

        User userTest = new User(1);
        Optional<User> optUserTest = Optional.of(userTest);
        Optional<Product> optProductTest = Optional.of(productTest);
        OrderVO orderVO = new OrderVO();
        Orders orders = new Orders(userTest);

        when(userRepository.findById(anyInt())).thenReturn(optUserTest);
        when(productRepository.findById(anyInt())).thenReturn(optProductTest);

        orderService.newOrder(orderVO);

        verify(productRepository, times(1)).save(productTest);
        verify(orderRepository, times(1)).save(orders);
        verify(orderProductRepository, times(1)).saveOrder(1,1,53);

    }

我不断遇到两个错误: 第一个指向verify(productRepository, times(1)).save(productTest); 并说

Wanted but not invoked:
productRepository.save(
    com.carlsberg.orderservice.domains.Product@a1db9da0
);
-> at com.carlsberg.orderservice.serviceImpl.OrderServiceImplTest.newOrder(OrderServiceImplTest.java:78)
Actually, there were zero interactions with this mock.

第二点指向verify(orderRepository, times(1)).save(orders); 错误消息是

Argument(s) are different! Wanted:
orderRepository.save(
    com.carlsberg.orderservice.domains.Orders@d7c7950f
);

差异似乎在d7c7950f部分。

这是我第一次尝试进行单元测试。真的不确定为什么会出现此错误,因为编写单元测试的相同概念在其他方法上也能很好地工作。

1 个答案:

答案 0 :(得分:1)

第一个错误是由于您的测试从未涵盖测试的ProductVo中有OrderVO的情况。由于该方法仅在经过ProductVO s的循环中被调用,因此使该方法成为“错误的”。

如果有帮助,请尝试添加一些ProductVO也许您仍然想用0 1进行测试,并且许多OrderVOs在0的情况下,只需删除存根就可以了,

第二个稍微复杂一点,在touyr服务中,您可以:

Orders order = new Orders(user);
orderRepository.save(order);

另一方面,您有:

Orders orders = new Orders(userTest);

没有保存您在测试中创建的订单的路径,它是在服务中创建的,因此哈希值也有所不同。我想当您将验证更改为时,该错误消失了:

verify(orderRepository, times(1)).save(any());

但是测试很糟糕,您应该对其进行修复以使用在测试中创建的订单。