Тест JUnit с Mockito - Как создать макет javax.ws.rs.client.ClientRequestContext? - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть класс, который реализует javax.ws.rs.client.ClientRequestFilter:

public class CustomFilter implements ClientRequestFilter {

@Override
public void filter(ClientRequestContext context) throws IOException {
    URI newUri = ... //replace a new uri
    context.setUri(URI.create(newUri));

    if (context.getMethod == "POST") {
        context.setMethod("GET");
        context.getHeaders().putSingle("ID","some string");
    }
}

Что я хочу, так или иначе, чтобы посмеяться над ClientRequestContext. Я хочу сравнить это после вызова функции filter ():

  1. Новый URI установлен правильно.
  2. Новый метод http установлен правильно.
  3. A для нового заголовка «ID» задана «некоторая строка» для контекста.

Поскольку я пытался выяснить, я могу только издеваться над методами получения, и я не знаю, как правильно смоделировать ClientRequestContext и использовать мой класс CustomerFilter для вызова реальной функции filter () для изменения значений объекта ClientRequestContext , поскольку он является интерфейсом. Не могли бы вы помочь мне выполнить 3 требования?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

Класс ClientRequestFilter является интерфейсом, поэтому его можно смоделировать либо с помощью метода stati c Mockito.mock, либо пометив поле как @Mock в тесте. Итак, если вы хотите проверить, вызывается ли метод setUri, вы должны сделать следующее в своем методе тестирования:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(ArgumentMatchers.any(URI.class));

Для более старых версий Mockito:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());

You не нужно проверять, что базовая реализация работает. Поскольку вы используете интерфейс, вы будете верить, что реализация, которая у вас будет во время выполнения, является правильной, поскольку нет необходимости проверять ваши зависимости. Вы просто должны быть уверены, что написанный вами код работает и пересылает запросы другим классам.

Аналогичным образом вы можете проверить другое требование:

Mockito.when(context.getMethod()).thenReturn("POST");
MultivaluedMap headers = Mockito.mock(MultivaluedMap.class);
Mockito.when(context.getHeaders()).thenReturn(headers);
CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());
Mockito.verify(context, Mockito.once()).setMethod(Matchers.any());
Mockito.verify(context, Mockito.once()).getHeaders();
1 голос
/ 17 февраля 2020

Вы можете использовать методы сопоставления аргументов и / или захватчики аргументов. Или вы пишете заглушку для контекста запроса и следите за ней:

package test;

import org.junit.Test;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.net.URI;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;

public class ClientRequestContextTest {

    abstract static class ClientRequestContextStub implements ClientRequestContext {
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        URI uri = null;
        String method = null;
        ClientRequestContextStub(){}
        @Override public String getMethod() { return method; }
        @Override public void setMethod(String method) { this.method = method; }
        @Override public URI getUri() { return uri; }
        @Override public void setUri(URI uri) { this.uri = uri; }
        @Override public MultivaluedMap<String, Object> getHeaders() { return headers; }
    }

    static class CustomFilter implements ClientRequestFilter {
        private String newUri = null;
        CustomFilter(String newUri) { this.newUri = newUri; }
        @Override
        public void filter(ClientRequestContext context) throws IOException {
            context.setUri(URI.create(newUri));
            if (context.getMethod().equals("POST")) {
                context.setMethod("GET");
                context.getHeaders().putSingle("ID", "some string");
            }
        }
    }

    @Test
    public void checkCustomFilter() throws IOException {
        URI newUriValue = URI.create("https://user:password@localhost:12345/suffix");
        ClientRequestContext context = spy(ClientRequestContextStub.class);
        context.setUri(URI.create("localhost:8080"));
        context.setMethod("POST");
        assertThat(context.getMethod(), equalTo("POST"));
        assertThat(context.getUri().toString(), equalTo("localhost:8080"));
        assertThat(context.getHeaders().size(), equalTo(0));
        new CustomFilter(newUriValue.toString()).filter(context);
        assertThat(context.getMethod(), equalTo("GET"));
        assertThat(context.getUri(), equalTo(newUriValue));
        assertThat(context.getHeaders().size(), equalTo(1));
        assertThat(context.getHeaders().getFirst("ID").toString(), is("some string"));
    }
}

...