2016-05-19 13 views
5

Sto usando Mockito con Junit per testare l'applicazione, ho bisogno di aggiungere intestazioni a HttpServletRequest mentre sto prendendo in giro. Questa è la prima volta che utilizzo il mock concept per testare l'applicazione. Come possiamo impostare le intestazioni per richiedere l'oggetto durante l'utilizzo di questo concetto fittizio?Come simulare HttpServletRequest con le intestazioni?

del codice Java:

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

    } 
} 

Ecco il mio codice di prova:

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

suo meraviglioso documentato, basta uno sguardo, u solo bisogno di scrivere qualcosa di simile Mockito.when (request.getHeaderNames()). ThenReturn (... quello che vuoi. ..) –

risposta

9

Come punto di partenza e dimostrazione per il committente si può iniziare con il seguente frammento.

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

uscita

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

Grazie, ha funzionato – Sat

+0

@Sathish Si prega di accettare la risposta se risolve il problema. – SubOptimal

+1

Non è stato più breve creare l'enumerazione con una chiamata all'enumerazione java.util.Collections #? – 473183469

Problemi correlati