为什么当原始代码工作正常时我的单元测试却没有通过?
Why are my unit tests not coming through when the original code works fine?
我的单元测试一直在发送错误消息,即使初始代码有效,而且我以相同的方式编写了其他单元测试并且它们运行良好。
初始代码:
@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
部分。
这是我第一次尝试做单元测试。真的不确定为什么我会收到此错误,因为编写单元测试的相同概念在其他方法上工作得很好。
第一个错误是由于您的测试从未涵盖测试 OrderVO
中有 ProductVo
的情况。这使得将该方法存根为 'wrong' 因为该方法仅在经过 ProductVO
s.
的循环中调用
如果有帮助,请尝试添加一些 ProductVO
。 也许你可能仍然想用 0 1 和许多 OrderVOs
在 0 情况下进行测试,只需删除存根,因为它不需要
第二个有点复杂,在你的服务中有:
Orders order = new Orders(user);
orderRepository.save(order);
另一方面,在你的测试中你有:
Orders orders = new Orders(userTest);
没有保存您在测试中创建的订单的路径,它总是在服务中创建,因此 hashsh 也不同。我想当您将 verify 更改为时,这个错误就会消失,比如:
verify(orderRepository, times(1)).save(any());
但是测试很糟糕,您应该修复它以使用您在测试中创建的订单。
我的单元测试一直在发送错误消息,即使初始代码有效,而且我以相同的方式编写了其他单元测试并且它们运行良好。
初始代码:
@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
部分。
这是我第一次尝试做单元测试。真的不确定为什么我会收到此错误,因为编写单元测试的相同概念在其他方法上工作得很好。
第一个错误是由于您的测试从未涵盖测试 OrderVO
中有 ProductVo
的情况。这使得将该方法存根为 'wrong' 因为该方法仅在经过 ProductVO
s.
如果有帮助,请尝试添加一些 ProductVO
。 也许你可能仍然想用 0 1 和许多 OrderVOs
在 0 情况下进行测试,只需删除存根,因为它不需要
第二个有点复杂,在你的服务中有:
Orders order = new Orders(user);
orderRepository.save(order);
另一方面,在你的测试中你有:
Orders orders = new Orders(userTest);
没有保存您在测试中创建的订单的路径,它总是在服务中创建,因此 hashsh 也不同。我想当您将 verify 更改为时,这个错误就会消失,比如:
verify(orderRepository, times(1)).save(any());
但是测试很糟糕,您应该修复它以使用您在测试中创建的订单。