首页 > 解决方案 > 当原始代码正常工作时,为什么我的单元测试没有通过?

问题描述

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

初始代码:

@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部分的。

这是我第一次尝试进行单元测试。真的不知道为什么我会得到这个错误,因为编写单元测试的相同概念在其他方法上工作得很好。

标签: spring-bootunit-testingmockitorepositoryjunit5

解决方案


第一个错误是由于您的测试从未涵盖测试中有ProductVos 的情况OrderVOProductVO这使得存根该方法是“错误的”,因为该方法仅在通过s的循环中调用。

ProductVO如果有帮助,请尝试添加一些s。也许您仍然可能想使用 0 1 进行测试,而许多OrderVOs0 情况下只需删除存根,因为它不需要

第二个有点复杂,在 touyr 服务中你有:

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

另一方面,在您的测试中,您有:

Orders orders = new Orders(userTest);

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

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

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


推荐阅读