集成测试调用tags/{tagId}/analyses接口返回404问题求解
错误原因
你最后一行测试代码硬编码了1作为tagId参数,这个ID在你当前测试运行的环境中不存在,接口校验tagId不存在时抛出NotFoundException,直接返回404状态码,和日志返回的Tag not found错误完全对应。
你前面已经通过前置接口请求拿到了当前测试上下文真实存在的标签列表tagResponses,直接使用列表里的有效标签ID即可解决问题。
修复方案
- 先校验前置接口返回的标签列表不为空,避免空指针错误
- 取列表中任意一个有效标签的ID替换硬编码的
1 - 确认常量
TAGS_API和ANALYSES_API的取值符合路径规则:TAGS_API应为/tags/,ANALYSES_API应为/analyses,确保拼接后的路径和接口定义的/tags/{tagId}/analyses完全匹配
修改后的测试代码
@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); // 新增校验:确认前置条件返回有效标签 assert !tagResponses.isEmpty(); // 取真实存在的标签ID Long validTagId = tagResponses.get(0).getId(); // 替换硬编码的1为有效ID mockMvc.perform(get(TAGS_API + validTagId + ANALYSES_API)).andExpect(status().isOk()); }
内容的提问来源于stack exchange,提问作者Jakub Kołacz
相关产品推荐
相关产品推荐

