spring-boot - 当原始代码正常工作时,为什么我的单元测试没有通过?
问题描述
即使初始代码有效并且我以相同的方式编写了其他单元测试并且它们运行良好,我的单元测试仍会继续发送错误消息。
初始代码:
@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
部分的。
这是我第一次尝试进行单元测试。真的不知道为什么我会得到这个错误,因为编写单元测试的相同概念在其他方法上工作得很好。
解决方案
第一个错误是由于您的测试从未涵盖测试中有ProductVo
s 的情况OrderVO
。ProductVO
这使得存根该方法是“错误的”,因为该方法仅在通过s的循环中调用。
ProductVO
如果有帮助,请尝试添加一些s。也许您仍然可能想使用 0 1 进行测试,而许多OrderVOs
0 情况下只需删除存根,因为它不需要
第二个有点复杂,在 touyr 服务中你有:
Orders order = new Orders(user);
orderRepository.save(order);
另一方面,在您的测试中,您有:
Orders orders = new Orders(userTest);
没有保存您在测试中创建的订单的路径,它总是在服务中创建,因此哈希也不同。我猜当您将验证更改为时,此错误会消失,例如:
verify(orderRepository, times(1)).save(any());
但是测试很糟糕,您应该修复它以使用您在测试中创建的订单。
推荐阅读
- create-react-app - 如何通过 create-react-app 在远程开发盒上使用 npm start
- r - 将列表中的多个 data.tables 组合成两个 data.tables 的列表
- bit-framework - 如何在配置 json 文件中嵌套配置并使用位读取它?
- .net - list.Clear() 与 new List<>() - ASP.NET Core - Entity Framework Core - 延迟加载
- grep - 大输出的 grep、求和和平均值
- vba - 为什么输入 Worksheets("Sheet1"). 后没有出现 Intellisense?
- linux - 如何使用 awk 工具对齐 csv 文件中的列
- react-native - 不变违规:元素类型无效:预期为字符串(用于内置组件)
- mysql - 如何正确更改表默认值
- vb.net - 使用 Visual Basic 在 .txt 文件中搜索文本