如何使用 Mockito 测试 Spring Rest 控制器.当控制器注入了 HttpServletRequest 的



我的控制器看起来像这样

@GetMapping("/networks/{networkId}")
public Resource<Network> getNetwork(
  @PathVariable("networkId") UUID id,
  HttpServletRequest request) {
    Resource<Network> network = networkClient.getNetwork(id);
    network.removeLinks();
    network.add(LinkHelper.getNetworkObjectLinkArray(request, id));
    return network;
}

测试看起来像这样

@Test
public void getNetwork() throws Exception {
    Resource<Network> networkResource = createSampleNetwork(organizationId, "Test Network 01");
    MockHttpServletRequest mockedRequest = new  MockHttpServletRequest(context.getServletContext()); 
    UUID networkId = HalParser.parseUUIDFromLink(networkResource.getId());
    when(networkRestController.getNetwork(networkId, mockedRequest))
        .thenReturn(networkResource);
    mockMvc.perform(get("/networks/" + HalParser.parseUUIDFromLink(networkResource.getId()))
        .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(print())
        .andDo(document.document(
                  responseFields(
                      fieldWithPath("name").description("The network's name"),
                      fieldWithPath("caName").description("The network's ca name"),
                      fieldWithPath("productFamily").description("The network's product family"),
                      fieldWithPath("productVersion").description("The version of the network core software"),
                      fieldWithPath("status").description("Provisioning status of the network"),
                      fieldWithPath("createdAt").description("Record creation time"),
                      fieldWithPath("updatedAt").description("Record last modification time"),
                      fieldWithPath("_links").description("<<resources-index-links,Links>> to other resources")
                  )
          ));
}

问题是我收到错误

"Method threw 'org.mockito.exceptions.misusing.UnfinishedStubbingException' exception. Cannot evaluate MyRestController$$EnhancerByMockitoWithCGLIB$$6fa8dd17.toString()"

如果我从控制器方法中删除 HttpServletRequest 并进行测试,这将起作用。

MockMvcRequestBuilders有两种方法

   public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) 
   public static MockHttpServletRequestBuilder get(URI uri) {

您可以使用第一个满足您的要求,如下所示

@Mock
HttpServletRequest req;

 mockMvc.perform(get("/networks/" + HalParser.parseUUIDFromLink(networkResource.getId()), req)
        .accept(MediaType.APPLICATION_JSON))
        .......

当然要考虑的几件事

  1. 如果您使用的是模拟@Mock (MockitoAnnotations.initMocks(this))则需要初始化模拟
  2. 您需要模拟在HttpServletRequest上拨打的电话