2016-05-19 6 views
5

私はアプリケーションをテストするためにJunitでMockitoを使用していますが、私はHockpServletRequestにヘッダーを追加する必要があります。私がアプリケーションをテストするために模擬コンセプトを使用しているのはこれが初めてです。この模擬コンセプトを使用している間に、オブジェクトをリクエストするようにヘッダーを設定するにはどうすればよいですか?ヘッダーでHttpServletRequestをモックする方法は?

Javaコード:あなたは以下のコードで開始することができ元本のための出発点とデモンストレーションとして

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

は、ちょうどuはちょうどMockito.when(request.getHeaderNames())のようなものを書く必要がある、見てください。あなたが望むthenReturn(...。 ..) –

答えて

9

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

    } 
} 

ここに私のテストコードです。その素晴らしい文書

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

出力

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

ありがとう、その仕事 – Sat

+0

@サシッシュあなたの問題を解決する場合は、答えを受け入れてください。 – SubOptimal

+1

java.util.Collections#enumerationの呼び出しで列挙を作成するのに時間がかかりませんでしたか? – 473183469