Насмешка с разными ответами на последовательные звонки - PullRequest
1 голос
/ 10 июля 2019

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

Mockito.doReturn(valid)
                .doReturn(inValid)
                .doReturn(valid)
                .doReturn(inValid)
                .doReturn(valid)
                .when(mySpy).isEligible(
                any(Item.class),anyString());

Это работало, когда тестируемый метод вызывал isElitable в цикле for

public int filter(List<Item> items){
    int count=0;
    for(i=0;i<items.size;i++){
        if(isEligible(items.get(i)))
           count++;
    return count;
}

Теперь я изменил его, чтобы использовать потоки Java

public int filter(List<Item> items){
    items.stream().filter(item -> isEligible(item));
    return items.size;
}

Теперь мой макет не работает, реальный метод вызывается

1 Ответ

0 голосов
/ 10 июля 2019

Заглушка последовательных вызовов (заглушка в стиле итератора) Использование thenReturn для последовательной заглушки

Иногда нам требуется заглушка с другим возвращаемым значением / исключением для одного и того же вызова метода,Типичным вариантом использования могут быть насмешливые итераторы.В оригинальной версии Mockito не было этой функции, способствующей простому издевательству.Например, вместо итераторов можно использовать Iterable или просто коллекции.Они предлагают естественные способы заглушки (например, с использованием реальных коллекций).В редких случаях может быть полезна заглушка последовательных вызовов:

 when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException())
.thenReturn("foo");

  //First call: throws runtime exception:
  mock.someMethod("some arg");

  //Second call: prints "foo"
   System.out.println(mock.someMethod("some arg"));

  //Any consecutive call: prints "foo" as well (last stubbing wins).
  System.out.println(mock.someMethod("some arg"));

Альтернативная, более короткая версия последовательной заглушки:

when(mock.someMethod("some arg"))
.thenReturn("one", "two", "three");

В вашем случае

Mockito.mock(mySpy.isEligible(any(Item.class))).thenReturn(true,false,false,true);
...