より複雑なメソッド/クラスの単体テストを作成することに関しては、まだ自信がありません。一般に、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 から新しい注文を作成しているだけです。注文明細ごとに、最初にアイテム サービスを使用して新しいアイテムを作成する必要があります。私のテストの 1 つは、itemService.create(...)
特定の引数を使用して注文明細ごとに への呼び出しが行われることを確認します。
への各呼び出しitemService.create(...)
は非常にコストがかかるため、クラスをリファクタリングして、1 つの要求ですべての項目を作成したいと思います。変更を行いましょう
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;
}
}
クラスの動作がまったく変更されていないにもかかわらず、変更を加えたところ、以前に作成したテストが失敗しました。
何か不足していますか?そのまま受け入れて、筆記試験を調整するだけですか?
どんな考えでも大歓迎です