如何初始化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 实际上允许您模拟接口。
我有一个带有 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 实际上允许您模拟接口。