在为更复杂的方法/类编写单元测试时,我仍然没有那么自信。我对 tdd 和单元测试的总体理解是,您应该能够重构类/方法的实现,并确信您没有改变它的行为
让我举个例子让事情更清楚。
public class OrderService implements IOrderService
{
private IItemService itemService;
public Order create(OrderCreationDto dto)
{
Order order = new Order();
order.addItems(createOrderLines(dto.products));
return order;
}
private Set<OrderLine> createOrderItems(List<ProductDto> products)
{
Set<OrderLine> orderLines = new HashSet<>();
for (ProductDto product : products) {
Item item = itemService.create(product.id, product.price);
OrderLine orderLine = new OrderLine();
orderLine.setItemId(item.id);
orderLines.add(orderLine);
}
return orderLines;
}
}
基本上我只是从 OrderCreationDto 创建一个新订单。对于每个订单行,我必须先使用商品服务来创建新商品。我的一项测试将确保itemService.create(...)
使用某些参数对每个订单行进行调用。
由于每次调用itemService.create(...)
都非常昂贵,我想重构该类以在一个请求中创建所有项目..让我们进行更改
public class OrderService implements IOrderService
{
private Set<OrderLine> createOrderItems(List<ProductDto> products)
{
Set<OrderLine> orderLines = new HashSet<>();
BatchItemCreationResponse response = itemService.createAll(products);
for (ProductDto product : products) {
Item item = response.get(product.id, product.price);
...
}
return orderLines;
}
}
现在我已经进行了更改,并且我之前编写的测试失败了,即使该类的行为根本没有改变。
我错过了什么吗?我必须接受它的方式并简单地调整笔试吗?
任何想法表示赞赏