For a service, it is good practice to either enter through the constructor or the setter. This makes it easy to mock and pass during unit testing. Regarding ridicule, you should use a framework like Mockito . Then you can do something like
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"));
Then you can simply pass all these mocks to your resource class when testing UNIT.
For INTEGRATION testing, you donβt need to scoff at the headers or uriinfo. Actual will be transferred. But you can still mock the service if you want. Here is an example
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)); } }
source share