How to mock HttpServletRequest with headers?

I use Mockito with Junit to test the application, I need to add headers to the HttpServletRequest while mocking. This is the first time I use a mock concept to test an application. How can we set headers for an object request using this mock concept?

Java Code:

@Produces({ MediaType.APPLICATION_JSON }) @Path("/devices") public class DvrRestService { private static final Logger logger = LoggerFactory.getLogger(DvrRestService.class); private DvrMiddleService dvrMiddleService; @Inject public DvrRestService(DvrMiddleService dvrMiddleService) { this.dvrMiddleService = dvrMiddleService; } @GET @Path("/{deviceId}/metadata") public Response getDeviceMetadata(@Context HttpServletRequest request, @PathParam("deviceId") String deviceId, @RequiredSession final Session session) { try { public static String[] REQUEST_HEADERS = { "if-none-match" }; List<String> requiredHeaders = Lists.newArrayList(REQUEST_HEADERS); Map<String, String> headers = new HashMap<String, String>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { // here gettting NullPointerException String headerName = headerNames.nextElement(); if (requiredHeaders.contains(headerName.toLowerCase())) { String value = request.getHeader(headerName); if (value != null) { headers.put(headerName, value); System.out.println("headerName: " + headerName + ", Value: " + value); } } } DvrResponse response = dvrMiddleService.getDeviceMetadata(deviceId.toUpperCase(), getHeaders(request)); return processResponse(response.statusCode, response.getResponse(), DeviceMetadataResponse.class, response.getHeaders()); } catch (Exception e) { return processErrorResponse(e, new DeviceMetadataResponse(), logger); } } } 

Here is my test code:

 public class DvrRestServiceTest { static DvrMiddleService dms; static HttpServletRequest request; static Session session; static DvrRestService drs; public static final String DeviceId = "000004D42070"; @BeforeClass public static void init(){ dms = mock(DvrMiddleService.class); request = mock(HttpServletRequest.class); session = mock(Session.class); drs = new DvrRestService(dms); } @Test public void getDeviceMetadataTest(){ Response rs = drs.getDeviceMetadata(request, DeviceId, session); assertEquals(Response.Status.OK, rs.getStatus()); } } 
+5
source share
1 answer

As a starting point and demonstration for a principal, you can start with the following snippet.

 // define the headers you want to be returned Map<String, String> headers = new HashMap<>(); headers.put(null, "HTTP/1.1 200 OK"); headers.put("Content-Type", "text/html"); // create an Enumeration over the header keys Iterator<String> iterator = headers.keySet().iterator(); Enumeration headerNames = new Enumeration<String>() { @Override public boolean hasMoreElements() { return iterator.hasNext(); } @Override public String nextElement() { return iterator.next(); } }; // mock HttpServletRequest HttpServletRequest request = mock(HttpServletRequest.class); // mock the returned value of request.getHeaderNames() when(request.getHeaderNames()).thenReturn(headerNames); System.out.println("demonstrate output of request.getHeaderNames()"); while (headerNames.hasMoreElements()) { System.out.println("header name: " + headerNames.nextElement()); } // mock the returned value of request.getHeader(String name) doAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return headers.get((String) args[0]); } }).when(request).getHeader("Content-Type"); System.out.println("demonstrate output of request.getHeader(String name)"); String headerName = "Content-Type"; System.out.printf("header name: [%s] value: [%s]%n", headerName, request.getHeader(headerName)); } 

Output

 demonstrate output of request.getHeaderNames() header name: null header name: Content-Type demonstrate output of request.getHeader(String name) header name: [Content-Type] value: [text/html] 
+10
source

All Articles