2016-11-24 12 views
1

ユニットテスト中にリストエレメントのメソッドシグネチャが呼び出されるかどうかを確認する方法は?以下のコードスニペットの場合、order模擬オブジェクトを使用して確認するときにitem.getPrice()が呼び出されたかどうかを確認するにはどうすればよいですか?リストエレメントメソッドが呼び出されているかどうかを確認する

public BigDecimal getTotalPrice(Order order) { 
    BigDecimal totalPrice = BigDecimal.ZERO; 
    for (Item item : order.getItems()) { 
     totalPrice.add(item.getPrice()); 
    } 

    return totalPrice; 
} 

ユニットテストコードスニペット:コードスニペットの実装

ここ

@Test 
public void testTotalPrice() { 
    List<Item> items = new ArrayList<>(); 
    for (BigDecimal price : prices) { 
     Item item = mock(Item.class); 
     when(item.getPrice()).thenReturn(price); 

     items.add(item); 
    } 

    Order order = mock(Order.class); 
    when(order.getItems()).thenReturn(items) 

    BigDecimal totalPrice = orderHandler.getTotalPrice(order); 
    verify(order, atLeastOnce()).getItems(); 
    verify(order.getItems().get(anyInt()), atLeastOnce()).getPrice(); 
    // assert 
} 

テストいつも失敗ばかり、スタックトレース(スニペット)を、

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here: 

-> // pointing to this line : verify(order.getItems().get(anyInt()), atLeastOnce()).getPrice(); 

このユニットテストシナリオを実装する最も良い方法は何ですか?

答えて

1

//...other code removed for brevity 
for (Item item : items) { 
    verify(item, atLeastOnce()).getPrice(); 
} 
+0

を試してみて、私は実際に検証し 'を使用することはできません(order.getItemsを()。(anyInt())、atLeastOnce()を取得)。getPriceを()'とに要素法を検証するために結果for-loop?もしそうなら、なぜですか? –

+0

テスト中の 'order.getItems()'は実際のリスト実装(items)を返しています。監視されており検証可能なモックではありません。リスト内の項目はモックであり、確認することができます。 – Nkosi

+0

それはまた、 'InvalidUseOfMatchersException'の理由です。 'anyInt()'は具体的なメソッドに適用されています。 – Nkosi

関連する問題