2016-05-19 12 views
5

Ich benutze Mockito mit Junit, um die Anwendung zu testen, ich muss Header hinzufügen, um die HttpServletRequest während Mocking. Dies ist das erste Mal, dass ich ein Mock-Konzept verwende, um die Anwendung zu testen. Wie können wir Header setzen, um ein Objekt anzufordern, während wir dieses Scheinkonzept verwenden?Wie HttpServletRequest mit Kopfzeilen zu verspotten?

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); 
     } 

    } 
} 

Hier ist mein Testcode:

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()); 
    } 
} 
+0

Seine wunderbar dokumentiert, nur einen Blick haben, u müssen nur so etwas wie Mockito.when (request.getHeaderNames()) schreiben. ThenReturn (... was Sie wollen. ..) –

Antwort

9

Als Ausgangspunkt und Demonstration für die Haupt Sie mit dem folgenden Ausschnitt beginnen.

// 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)); 
} 

Ausgang

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] 
+0

Danke, es hat funktioniert – Sat

+0

@Sathish Bitte akzeptieren Sie die Antwort, wenn es Ihr Problem löst. – SubOptimal

+1

War es nicht kürzer, die Aufzählung mit einem Aufruf von java.util.Collections # enumeration zu erstellen? – 473183469