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