如何初始化JAX-RS HttpHeaders

How to initialize JAX-RS HttpHeaders

我有一个带有 class 的内部框架,如下所示:

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

而且我需要为 class 编写单元测试以扩展它以使用类似

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

有问题的 HttpHeaders 类型是 javax.ws.rs.core.HttpHeaders 下的接口,不公开任何初始化方法,仅公开 getter。我没有接触现有代码。

如何在不设置整个 ResponseEntity 的情况下像这样模拟 headers object?

您可以只使用像 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");
    }
}

下面是一个完整的测试,向您展示了使用该库进行测试的一般方法。如果您以前从未使用过该库,我建议您花一些时间阅读文档。学习基础知识非常容易。

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");
        }
    }
}

使用 Mockito,您可以完全按照需要将 getX 方法的行为模拟到 return 存根。我发现保罗的回答足够完整。此外,mockito.mock 实际上允许您模拟接口。