使用球衣测试框架模拟资源内部服务
Mock Service inside resource using jersey test framwork
我有一个使用服务的休息资源API。
该服务有一个带参数的构造函数。
我想测试这个资源并模拟这个服务。
这个Question: How to pass parameters to REST resource using Jersey 2.5
没有帮助,因为他们使用了@Inject 而我不能使用它。
有什么建议吗?
第二个问题是如何传递参数来测试这个资源:
我的代码是:
@Path("/2/{subversion: [0-3]}/users")
public class UserResource {
Logger log = Logger.getLogger(UserResource.class);
private MyService service;
public void setService(Service ser) {
this.service = ser;
}
@Context HttpServletRequest currentRequest;
@GET
@Produces("application/json")
public Response getUsers(@Context HttpHeaders httpHeaders, @Context UriInfo
uriInfo) {
// my function
}
}
我怎样才能通过 "httpHeaders" 和 "UriInfo"。
我的测试如下所示:
Response response = target("/2/0/users/").request().get();
Users users = response.readEntity(Users.class);
assertNotNull(users);
对于服务,最好通过构造函数或 setter 注入。这使得在单元测试期间模拟和传递变得容易。至于模拟,你应该使用像Mockito这样的框架。然后你可以做类似
的事情
MyService service = Mockito.mock(MyService.class);
when(service.getObject()).thenReturn(new Object());
HttpHeaders headers = Mockito.mock(HttpHeaders.class);
when(headers.getHeaderString("X-Header")).thenReturn("blah");
UriInfo uriInfo = Mockito.mock(UriInfo.class);
when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost"));
然后您可以在 UNIT 测试时将所有这些模拟传递给您的资源 class。
对于 INTEGRATION 测试,您不需要模拟 headers 或 uriinfo。实际的将被传递进来。但如果你愿意,你仍然可以模拟该服务。这是一个例子
public class MockServiceTest extends JerseyTest {
public static interface Service {
String getMessage(String name);
}
@Path("message")
public static class MessageResource {
private final Service service;
public MessageResource(Service service) {
this.service = service;
}
@GET
public String get(@QueryParam("name") String name,
@Context HttpHeaders headers,
@Context UriInfo uriInfo) {
String nameQuery = uriInfo.getQueryParameters().getFirst("name");
String header = headers.getHeaderString("X-Header");
assertNotNull(nameQuery);
assertNotNull(header);
return service.getMessage(name);
}
}
private Service service;
@Override
public ResourceConfig configure() {
service = Mockito.mock(Service.class);
return new ResourceConfig().register(new MessageResource(service));
}
@Test
public void testIt() {
Mockito.when(service.getMessage("peeskillet")).thenReturn("Hello peeskillet");
Response response = target("message").queryParam("name", "peeskillet").request()
.header("X-Header", "blah")
.get();
assertEquals(200, response.getStatus());
assertEquals("Hello peeskillet", response.readEntity(String.class));
}
}
我有一个使用服务的休息资源API。 该服务有一个带参数的构造函数。 我想测试这个资源并模拟这个服务。 这个Question: How to pass parameters to REST resource using Jersey 2.5
没有帮助,因为他们使用了@Inject 而我不能使用它。 有什么建议吗?
第二个问题是如何传递参数来测试这个资源: 我的代码是:
@Path("/2/{subversion: [0-3]}/users")
public class UserResource {
Logger log = Logger.getLogger(UserResource.class);
private MyService service;
public void setService(Service ser) {
this.service = ser;
}
@Context HttpServletRequest currentRequest;
@GET
@Produces("application/json")
public Response getUsers(@Context HttpHeaders httpHeaders, @Context UriInfo
uriInfo) {
// my function
}
}
我怎样才能通过 "httpHeaders" 和 "UriInfo"。 我的测试如下所示:
Response response = target("/2/0/users/").request().get();
Users users = response.readEntity(Users.class);
assertNotNull(users);
对于服务,最好通过构造函数或 setter 注入。这使得在单元测试期间模拟和传递变得容易。至于模拟,你应该使用像Mockito这样的框架。然后你可以做类似
的事情MyService service = Mockito.mock(MyService.class);
when(service.getObject()).thenReturn(new Object());
HttpHeaders headers = Mockito.mock(HttpHeaders.class);
when(headers.getHeaderString("X-Header")).thenReturn("blah");
UriInfo uriInfo = Mockito.mock(UriInfo.class);
when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost"));
然后您可以在 UNIT 测试时将所有这些模拟传递给您的资源 class。
对于 INTEGRATION 测试,您不需要模拟 headers 或 uriinfo。实际的将被传递进来。但如果你愿意,你仍然可以模拟该服务。这是一个例子
public class MockServiceTest extends JerseyTest {
public static interface Service {
String getMessage(String name);
}
@Path("message")
public static class MessageResource {
private final Service service;
public MessageResource(Service service) {
this.service = service;
}
@GET
public String get(@QueryParam("name") String name,
@Context HttpHeaders headers,
@Context UriInfo uriInfo) {
String nameQuery = uriInfo.getQueryParameters().getFirst("name");
String header = headers.getHeaderString("X-Header");
assertNotNull(nameQuery);
assertNotNull(header);
return service.getMessage(name);
}
}
private Service service;
@Override
public ResourceConfig configure() {
service = Mockito.mock(Service.class);
return new ResourceConfig().register(new MessageResource(service));
}
@Test
public void testIt() {
Mockito.when(service.getMessage("peeskillet")).thenReturn("Hello peeskillet");
Response response = target("message").queryParam("name", "peeskillet").request()
.header("X-Header", "blah")
.get();
assertEquals(200, response.getStatus());
assertEquals("Hello peeskillet", response.readEntity(String.class));
}
}