2016-05-19 28 views
5

Tôi đang sử dụng Mockito cùng với Junit để kiểm tra ứng dụng, tôi cần thêm tiêu đề vào HttpServletRequest trong khi chế nhạo. Đây là lần đầu tiên tôi sử dụng khái niệm giả để kiểm tra ứng dụng. Làm thế nào chúng ta có thể đặt tiêu đề để yêu cầu đối tượng trong khi sử dụng khái niệm giả này?Làm thế nào để giả lập HttpServletRequest với tiêu đề?

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

    } 
} 

Đây là Mã thử nghiệm của tôi:

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

của nó tuyệt vời ghi nhận, chỉ cần có một cái nhìn, u chỉ cần phải viết một cái gì đó giống như Mockito.when (request.getHeaderNames()). ThenReturn (... những gì bạn muốn. ..) –

Trả lời

9

Như một điểm khởi đầu và trình diễn cho chính bạn có thể bắt đầu với đoạn mã sau.

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

đầu ra

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

Cảm ơn, nó đã hoạt động – Sat

+0

@Sathish Hãy chấp nhận câu trả lời nếu nó giải quyết được vấn đề của bạn. – SubOptimal

+1

Không phải là ngắn hơn để tạo ra các điều tra với một cuộc gọi đến java.util.Collections # enumeration? – 473183469

Các vấn đề liên quan