24

次のスニペットを含むテスト対象のメソッドがあります。

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)していますが、使用されることはないと思います。

4

2 に答える 2

63

あなたの問題は、コレクションを for-each ループで使用すると、そのiterator()メソッドが呼び出されることです。その特定のメソッドをスタブしていません。

リストをモック化する代わりに、要素がモック化された実際のリストを必要なだけTracedPath何度でも渡すことを強くお勧めします。何かのようなもの

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);
于 2013-08-28T09:19:56.073 に答える