首页 > 解决方案 > 创建集成测试

问题描述

我是编写集成测试的新手。我必须编写代码来检查我的 get 方法是否返回代码 200。问题是这个方法非常复杂。我使用 3 个 API 让它运行。下面我留下测试方法的代码:

@Test
@WithUserDetails("operator")
public void getAnalysesByTagId_shouldReturn200() throws Exception {
    objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    MvcResult mvcResult = mockMvc.perform(multipart("/documents")
                    .file(getMetaDataFile("fileForAnalysisAndTags" + new Random().nextInt() + ".xlsx")))
            .andExpect(status().isCreated()).andReturn();
    DocumentCreateResponse document = parseResponse(mvcResult, DocumentCreateResponse.class);
    MvcResult mvcDocumentDetails = mockMvc.perform(get("/documents/" + document.getId() + "/details")).andReturn();
    DocumentDetailsResponse documentDetailsResponse = parseResponse(mvcDocumentDetails, DocumentDetailsResponse.class);
    MvcResult mvcResultTag = mockMvc.perform(get("/tags/" + documentDetailsResponse.getAreaId() + "/children")).andReturn();
    List<TagResponse> tagResponses = parseResponseList(mvcResultTag, TagResponse.class);
    mockMvc.perform(get(TAGS_API + 1 + ANALYSES_API)).andExpect(status().isOk());
}

它返回代码 404 而不是 200,我在最后一行做错了。我还留下了正在测试的方法的代码:

@GetMapping("tags/{tagId}/analyses")
@ApiOperation(value = "Find analyses associated with tag", produces =  MediaType.APPLICATION_JSON_VALUE, notes = "Required Role: OPERATOR/USER")
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Analyses found"),
        @ApiResponse(code = 404, message = "Not found, incorrect tag ID"),
        @ApiResponse(code = 500, message = "Server error, something went wrong"),
        @ApiResponse(code = 401, message = "Request lacks valid authentication credentials.")
})
public ResponseEntity<List<FindAnalysisResponse>> getAnalysesByTagId(
        @PathVariable("tagId") Long tagId) throws NotFoundException {
    var analyses = service.getAnalysesByTagId(tagId)
            .stream()
            .map(findAnalysisMapper::fromAnalysis)
            .collect(Collectors.toList());
    return new ResponseEntity<>(analyses, HttpStatus.OK);

}

在日志中我可以看到,只有最后几行会产生错误:

Async:
Async started = false
 Async result = null

Resolved Exception:
         Type = com.name.common.domain.NotFoundException

ModelAndView:
    View name = null
         View = null
        Model = null

FlashMap:
   Attributes = null

MockHttpServletResponse:
       Status = 404
Error message = null
      Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", Content-Type:"text/plain;charset=UTF-8", Content-Length:"15", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
 Content type = text/plain;charset=UTF-8
         Body = "Tag not found"
Forwarded URL = null
 Redirected URL = null
      Cookies = []

我应该怎么做才能让它工作?

标签: javajunitintegration-testing

解决方案


可能没有标签1存在吗?mockMvc.perform(get(TAGS_API + 1 + ANALYSES_API)).andExpect(status().isOk());


推荐阅读