使用泽西测试框架模拟服务内部资源

时间:2016-01-19 22:57:14

标签: java rest unit-testing jersey-2.0 jersey-test-framework

我有一个使用服务的rest 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);

1 个答案:

答案 0 :(得分:8)

对于服务,通过构造函数或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 测试时,您可以将所有这些模拟传递给资源类。

对于 INTEGRATION 测试,您无需模拟标头或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));
    }
}