如果控制器在方法

时间:2018-01-08 19:22:30

标签: spring junit mockito

我的控制器看起来像这样

@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并进行测试,这是有效的。

1 个答案:

答案 0 :(得分:0)

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. ,则需要初始化模拟
  3. 您需要模拟在HttpServletRequest
  4. 上进行的调用