Как инициализировать JAX-RS HttpHeaders - PullRequest
1 голос
/ 22 января 2020

У меня есть внутренняя структура с классом, который выглядит следующим образом:

public abstract class POSEnterpriseResource extends SynchronousResource {
  ...
  @Inject
  protected HttpHeaders headers;
  ...
}

И мне нужно написать модульные тесты для класса, который расширяет его для использования кода, подобного

String acceptMediaType = headers.getHeaderString("Accept");
String acceptVersion = headers.getHeaderString("Accept-Version");

Тип HttpHeaders, о котором идет речь, является интерфейсом под javax.ws.rs.core.HttpHeaders и не предоставляет никаких методов инициализации, только получателей. Я не могу прикоснуться к существующему коду.

Как мне смоделировать объект заголовка, подобный этому, без настройки целого ResponseEntity?

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Вы можете просто использовать библиотеку-насмешку, например Mockito . Вот как настроить тест

// set up the runner so Mockito handles all the 
// initialization and injections
@RunWith(MockitoJUnitRunner.class)
public class Testing {

    // HttpHeaders is mocked and injected into test
    @Mock
    private HttpHeaders headers;

    // HttpHeaders is injected into the resource class field
    @InjectMocks
    private TestResource resource;

    @Test
    public void testHttpHeaders() {
        // control what the mock returns when certain methods are called
        when(headers.getHeaderString("X-Test")).thenReturn("X-Test-Value");
    }
}

А ниже приведен полный тест, чтобы показать вам общий способ тестирования с использованием библиотеки. Если вы никогда ранее не пользовались этой библиотекой, я предлагаю потратить некоторое время на go через документы. Изучить основы довольно просто.

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.HttpHeaders;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;


@RunWith(MockitoJUnitRunner.class)
public class Testing {

    @Mock
    private HttpHeaders headers;

    @InjectMocks
    private TestResource resource;

    @Test
    public void testHttpHeaders() {
        when(headers.getHeaderString("X-Test")).thenReturn("X-Test-Value");

        String response = resource.get();
        assertThat(response).isEqualTo("X-Test-Value");
    }


    @Path("test")
    public static class TestResource {

        @Inject
        private HttpHeaders headers;

        @GET
        @Produces("text/plain")
        public String get() {
            return headers.getHeaderString("X-Test");
        }
    }
}
0 голосов
/ 23 января 2020

Используя Mockito, вы можете смоделировать поведение методов getX, чтобы вернуть заглушки именно так, как вы хотите. Я нахожу ответ Пола достаточно полным. Кроме того, mockito.mock на самом деле позволяет имитировать интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...