簡體   English   中英

如何使用Mockito模擬forEach行為

[英]How to mock forEach behavior with Mockito

我想做以下工作,但我不知道如何正確模擬forEach行為。 (代碼摘自一個相關的問題, 測試Java增強了Mockito的行為

@Test
public void aa() {
  Collection<String> fruits;
  Iterator<String> fruitIterator;

  fruitIterator = mock(Iterator.class);
  when(fruitIterator.hasNext()).thenReturn(true, true, true, false);
  when(fruitIterator.next()).thenReturn("Apple")
      .thenReturn("Banana").thenReturn("Pear");

  fruits = mock(Collection.class);
  when(fruits.iterator()).thenReturn(fruitIterator);
  doCallRealMethod().when(fruits).forEach(any(Consumer.class));

  // this doesn't work (it doesn't print anything)
  fruits.forEach(f -> {
    mockObject.someMethod(f); 
  });

  // this works fine
  /*
  int iterations = 0;
  for (String fruit : fruits) {
    mockObject.someMethod(f); 
  }
  */

  // I want to verify something like this
  verify(mockObject, times(3)).someMethod(anyString());
}

任何幫助將不勝感激。

Collection接口的forEach方法是“防御者”方法; 它不使用Iterator而是調用傳遞給該方法的Consumer

如果您使用的是Mockito版本2+(*),則可以要求調用Collection接口的默認方法forEach

Mockito.doCallRealMethod().when(fruits).forEach(Mockito.any(Consumer.class));

請注意,“ defender”方法實際上將請求一個Iterator遍歷該集合,因此將使用您在測試中模擬的Iterator 如果嘲笑的集合未提供Iterator則該方法將無法正常工作,例如when(fruits.iterator()).thenReturn(fruitIterator)

(*):Mockito從版本2開始增加了支持Java 8默認(“防御者”)方法的可能性-您可以在此處檢查跟蹤問題。

Iterator mockIterator = mock(Iterator.class);
doCallRealMethod().when(fruits).forEach(any(Consumer.class));
when(fruits.iterator()).thenReturn(mockIterator);
when(mockIterator.hasNext()).thenReturn(true, false);
when(mockIterator.next()).thenReturn(mockObject);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM