Подтвердить что ты не робот

Mockito: высмеивает arraylist, который будет зациклен в цикле for

У меня есть тестируемый метод, содержащий следующий фрагмент:

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

Мой unit test код выглядит следующим образом:

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), но, я думаю, он никогда не используется.

4b9b3361

Ответ 1

Ваша проблема в том, что когда вы используете коллекцию в цикле for-each, ее метод iterator() вызывается; и вы не остановили этот конкретный метод.

Вместо того, чтобы насмехаться над списком, я настоятельно рекомендую вам просто передать реальный список, в котором элементы будут просто вашими издеваемыми TracedPath, столько раз, сколько вы этого захотите. Что-то вроде

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);

Ответ 2

Цикл Java For-Every, используемый внутри вашего метода buildChainCode, не вызывает get(), как вы уже выяснили, - используя метод iterator(), определенный в Collection<E>, который List<E> расширяется.

Я бы не рекомендовал насмехаться над списком. Нет никакого преимущества для этого, если вы абсолютно не должны проверять, что список был повторен, и даже тогда, лучше утверждать или проверять результаты вашего поведения класса с определенными входами.

Передайте некоторую реализацию List<E> как LinkedList<E> с tracedPath в ней.