1

より複雑なメソッド/クラスの単体テストを作成することに関しては、まだ自信がありません。一般に、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;
    }
}

クラスの動作がまったく変更されていないにもかかわらず、変更を加えたところ、以前に作成したテストが失敗しました。

何か不足していますか?そのまま受け入れて、筆記試験を調整するだけですか?

どんな考えでも大歓迎です

4

1 に答える 1

1

何か不足していますか?そのまま受け入れて、筆記試験を調整するだけですか?

いいえはい。

単体テスト変更されます。特定のコントラクト ( ) を利用するために、いくつかのクラスに基づいてテストを設定しましたItemService。このコントラクトを変更するには、それと同じくらい簡単にテストを変更する必要があります。

別の方法で考えてみてください。テストされたクラスのクライアントの観点からは、何も変更されておらず、動作も同じです (これは良いことです)。ただし、ItemServiceクライアントの観点から見ると、破壊的変更(契約変更) が導入されました。ItemServiceクライアントは誰ですか?この場合、OrderServiceおよびそのテスト。

また、状態の検証(製品の状態のアサート) が動作の検証(検証モックが呼び出された)OrderServiceよりも適切ではないかどうかを検討する必要があります。前者は通常、そのような変更に対するテストの脆弱性を軽減しますが、変更を導入する必要がなくなるわけではありません。

于 2012-07-05T11:27:18.363 に答える