Mockito. Как вернуть разные результаты при вызове одного и того же смоделированного метода? - PullRequest
0 голосов
/ 05 июня 2019

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

Я пытался использовать doReturn - когда и это работает, но я не могу заставить его вернуть другой результат.Я не знаю, как это сделать.

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

Проблема в том, что я получаю ошибку компиляции "Метод XXX не определен для типа OngoingStubbing

скажем, я не слишком хорошо разбираюсь в Mockito и не очень понимаю, в чем проблема.

JSONArray jsonArray1 = { json array1 here };
JSONArray jsonArray2 = { json array2 here };

// Works but return the same jsonArray1 every time:
MyClass MyClassMock = mock(MyClass.class);
    Mockito.doReturn(jsonArray1)
            .when(MyClassMock).getMyValues(any(List.class), any   (String.class), any(String.class),
                    any(String.class),
                    any(String.class));

// Does not work:
    when(MyClassMock).getMyValues(any(List.class),
           any(String.class), any(String.class),
           any(String.class),
           any(String.class)).thenReturn(jsonArray1, jsonArray2);


// Compile error:
// The method getMyValues(any(List.class), any(String.class), any (String.class), any(String.class), any(String.class)) is undefined for the type OngoingStubbing<MyClass>

Я получаю ошибку компиляции:

Метод getMyValues ​​(any (List.class), any (String.class), any (String.class), any (String.class), any (String.class)) не определено для типа OngoingStubbing

Ответы [ 4 ]

1 голос
/ 05 июня 2019

Сначала вам нужно поместить метод mocked внутри: когда:

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenReturn(...);

Также, если вы хотите больше контроля над тем, что возвращается (например, в зависимости от входных параметров метода, вы должны использовать Ответ вместо того, чтобы просто возвращать значения.

Так что это было бы лучшим решением, я думаю:

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenAnswer(new Answer<JSONArray> {/*Add implementation here*/});

Может быть этот пост может помочь с использованием ответакласс Мокито.

1 голос
/ 05 июня 2019

Убедитесь, что вы поместили макет + его метод внутри when:

when(MyClassMock.getMyValues(any(List.class),
           any(String.class), any(String.class),
           any(String.class),
           any(String.class))
    .thenReturn(jsonArray1)
    .thenReturn(jsonArray2);
0 голосов
/ 10 июня 2019

Последнее предложение сработало!

Mockito.doReturn (obj1) .doReturn (obj2) .when (this.client) .someMethod ();

Спасибо всем за помощь! / Январь

0 голосов
/ 05 июня 2019

Для обычных издевательств вы можете использовать что-то вроде этого:

when(mockFoo.someMethod())
            .thenReturn(obj1, obj2)
            .thenThrow(new RuntimeException("Fail"));

Если вы используете spy () и doReturn () вместо метода when ():

то, что вам нужно для возврата другого объекта при разных вызовах, это:

doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...