2013-08-28 15 views
17

のためにループされるのArrayListをからかっ:Mockito:私は、次のコードが含まれているテスト対象のメソッドを持っているループ

private void buildChainCode(List<TracedPath> lines){ 
    for(TracedPath path : lines){ 
     /.../ 
    } 
} 

私のユニットテストコードは次のようになります。

public class ChainCodeUnitTest extends TestCase { 

    private @Mock List<TracedPath> listOfPaths; 
    private @Mock TracedPath tracedPath; 

    protected void setUp() throws Exception { 
     super.setUp(); 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testGetCode() { 
     when(listOfPaths.get(anyInt())).thenReturn(tracedPath); 

     ChainCode cc = new ChainCode(); 
     cc.getCode(listOfPaths); 

     /.../ 
    } 
} 

問題は、テストの実行中に、テストコードがforループに入ることがないということです。 forループが入力されるように条件を指定する必要があるときはどうなりますか?現在はwhen(listOfPaths.get(anyInt())).thenReturn(tracedPath)を指定していますが、決して使用されていないと思います。

答えて

47

for-eachループでコレクションを使用すると、そのiterator()メソッドが呼び出されるという問題があります。あなたはその特定の方法を突き詰めていません。

リストを嘲笑するのではなく、欲しいだけ何度でも要素を嘲笑したTracedPathの本当のリストを渡すことを強くお勧めします。

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath); 
ような何か
+0

ありがとう、それは素晴らしい考えです。良い説明も。 :) –

+0

リストに追加される要素がわからない場合はどうすればよいですか? – BlueShark

+0

テストする内容に応じて要素を選択します。 –

4

すでに考え出しとしてあなたbuildChainCodeメソッド内で使用するJavaについては、各ループは、get()を呼び出していません - それはList<E>が延びCollection<E>で定義されたiterator()方法を、使用しています。

I 実際にはは、リストを嘲笑することはお勧めしません。リストが反復されたことを絶対に確認しなければならない限り、それには利点はありません。それでも、特定の入力を与えられたクラスの振る舞いの結果をアサートしたり、検証したりする方が良いでしょう。

List<E>の実装にはLinkedList<E>のようにtracedPathを渡します。

+0

良い説明をいただきありがとうございます。私は答えとしてマークしますが、非常によく似たものがあなたの3分前に提出されました。 –

+0

ご意見ありがとうございます。私は私のポストを終えることができる前に何かを修正するために離れて呼ばれた - c'estラビ::)デビッドは良い答えです。 –

関連する問題