Возможна установка макета после использования в цикле, например.

for(String key: mySet) { ...}

Спасибо.

8
user710818 25 Авг 2011 в 19:27

2 ответа

Лучший ответ

Есть пара вариантов:

  1. Брось это
  2. Использовать аннотацию @Mock

Примеры:

Set<String> mySet = (Set<String>) mock(Set.class);

--или--

@Mock
private Set<String> mySet;

@Before
public void doBefore() throws Exception {
    MockitoAnnotations.initMocks(this.getClass()); //this should create mocks for your objects...
}
13
leo 6 Авг 2014 в 11:50

Хотя в ответе Николаса совершенно ясно объясняется, как вы имитируете Set, я думаю, что ваш вопрос также подразумевает, что вы хотите издеваться над поведением набора во время цикла.

Для этого вам сначала нужно знать, что ваш код является только синтаксическим сахаром и расширяется до:

for (Iterator iterator = mySet.iterator(); iterator.hasNext();) { 
    String key = (String) iterator.next(); 
    ...
}

(Подробнее об этом см. В вопросе Stackoverflow который что более эффективно, цикл for-each или итератор?)

Это дает понять, что вам нужно имитировать метод iterator(). После того, как вы настроили макет, как описано Николасом, вы имитируете метод итератора следующим образом:

when(mySet.iterator()).thenAnswer(new Answer<Iterator<String>>() {
   @Override
   public Iterator<String> answer(InvocationOnMock invocation) throws Throwable {
      return Arrays.asList("A", "B").iterator();
   }
});
8
Community 23 Май 2017 в 11:47