即使初始代码有效,我的单元测试仍继续发送错误消息,而我以相同的方式编写了其他单元测试,并且它们运行良好。
初始代码:
@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
部分。
这是我第一次尝试进行单元测试。真的不确定为什么会出现此错误,因为编写单元测试的相同概念在其他方法上也能很好地工作。
答案 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());
但是测试很糟糕,您应该对其进行修复以使用在测试中创建的订单。