Насмешливое общее количество последовательных ответов от частичного издевательства с Mockito - PullRequest
3 голосов
/ 28 марта 2012

Я создаю общий общий mock-клиент для тестирования HTTP-взаимодействий.Для этого я хотел бы иметь возможность сделать несколько ответов одним и тем же методом.При обычной имитации это не будет проблемой:

when(mock.execute(any(), any(), any())).thenReturn(firstResponse, otherResponses)

Однако я использую частичную имитацию, где я просто хочу смоделировать метод, выполняющий HTTP-запрос, поскольку доступ кживая конечная точка или Интернет вообще в этом отношении в контексте, где выполняются юнит-тесты.

Так что я буду делать что-то вроде:

doReturn(response).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture());

Однако я быхотел бы иметь возможность поддерживать более одного ответа (не так много "взаимодействия").Но нет метода doReturn, который принимает более одного ответа за раз.

Моей первой попыткой решения было сделать это итеративно:

Stubber stubber = null;
for (HttpResponse response : responses) {
    if (stubber == null) {
        stubber = doReturn(response);
    } else {
        stubber = stubber.doReturn(response);
    }
}
stubber.when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture());

Однако при проверке это не удается проверить («Обнаружена незавершенная заглушка»).

Итак - есть ли способ достичь этого с помощью Mockito?

Спасибо за чтение.

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Вы можете написать

doReturn( 1 ).doReturn( 2 ).doReturn( 3 ).when( myMock ).myMethod( any(), any(), any());

Edit:

Если нужные значения находятся в массиве myArray, то вы также можете использовать

import static java.util.Arrays.asList;
import static org.mockito.Mockito.doAnswer;
import org.mockito.stubbing.answers.ReturnElementsOf

....

doAnswer( new ReturnsElementsOf( asList( myArray )))
   .when( myMock ).myMethod( any(), any(), any());
1 голос
/ 29 марта 2012

Решением, которое я нашел, было использование doAnswer для возврата следующего ответа в массиве.

Answer<HttpResponse> answer = new Answer<HttpResponse>() {

    HttpResponse[] answers = responses;
    int number = 0;

    @Override
    public HttpResponse answer(InvocationOnMock invocation) throws Throwable {
        HttpResponse result = null;
        if (number <= answers.length) {
            result = answers[number]; 
            number++;
        } else {
            throw new IllegalStateException("No more answers");
        }
        return result;
    }
};
doAnswer(answer).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...