如何将String转换为SolrDocumentList?MockMVC测试遇空指针问题
解决Mock SolrDocumentList时的空指针与字符串转SolrDocumentList问题
我正尝试为SearchController编写MockMVC测试,希望Mock Solr数据到API的入口,以便让API完成后续排序操作,并通过MockMVC测试验证服务。但在测试代码中设置mockedSolrDocList的toString返回值时出现空指针异常,同时想知道有没有办法将String转换为SolrDocumentList?
测试代码如下:
@ExtendWith({SpringExtension.class}) @WebMvcTest(SeaController.class) @AutoConfigureMockMvc(addFilters = false) class SeaControllerTest { private MockMvc mockMvc; @Autowired WebApplicationContext webApplicationContext; @MockBean private SeaService seaService; @MockBean MesService mesService; @MockBean private SeaCommand seaCommand; @MockBean private AuthenticationProvider authenticationProvider; private SolrDocumentList mockedSolrDocList ; @Before public void setUp() { MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void findByQuery() throws Exception { String jsonBody = (Files.readString(Paths.get("local path to /payload.txt"))); String responseBody = (Files.readString(Paths.get("local path to /response.txt"))); //solrDoc contains list of SolrDocs String mockSolrdocList = (Files.readString(Paths.get("local path to /solrDoc.txt"))); //getting null pointer exception for below line when(mockedSolrDocList.toString()).thenReturn(mockSolrdocList); mockMvc.perform(MockMvcRequestBuilders.post("/query") .contentType(MediaType.APPLICATION_JSON_VALUE) .characterEncoding("utf-8") .content(jsonBody) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(org.hamcrest.Matchers.containsString(responseBody))); } }
问题解决步骤
1. 修复空指针异常
空指针的直接原因是mockedSolrDocList仅声明未初始化,有两种修复方式:
- 直接实例化:
private SolrDocumentList mockedSolrDocList = new SolrDocumentList(); - 用Mockito创建Mock对象:
@Mock private SolrDocumentList mockedSolrDocList; // 同时需要在setUp中初始化Mock,或者将类上的@ExtendWith替换为@ExtendWith(MockitoExtension.class)
2. 将字符串转换为SolrDocumentList
根据solrDoc.txt的格式,选择对应转换方式:
方式一:基于Jackson解析JSON格式文档列表
如果文件内容是纯Solr文档的JSON数组:
ObjectMapper mapper = new ObjectMapper(); // 先将字符串转为Map列表,再转成SolrDocumentList List<Map<String, Object>> docMaps = mapper.readValue( mockSolrdocList, new TypeReference<List<Map<String, Object>>>() {} ); SolrDocumentList solrDocList = new SolrDocumentList(); for (Map<String, Object> map : docMaps) { SolrDocument doc = new SolrDocument(); doc.putAll(map); solrDocList.add(doc); }
方式二:用Solr自带解析器处理标准查询返回JSON
如果文件内容是Solr查询返回的完整JSON(包含response节点):
JSONResponseParser parser = new JSONResponseParser(); SolrQueryResponse solrResponse = new SolrQueryResponse(); parser.processResponse( mockSolrdocList.getBytes(StandardCharsets.UTF_8), solrResponse ); SolrDocumentList solrDocList = solrResponse.getResults();
3. 正确Mock服务返回
你的核心需求是让API获取Mock的Solr数据,无需MockSolrDocumentList的toString,直接Mock业务服务的返回即可:
// 假设SeaService有返回SolrDocumentList的方法,比如querySolr(xxx) when(seaService.querySolr(any())).thenReturn(solrDocList);
内容的提问来源于stack exchange,提问作者Sigma
相关产品推荐
相关产品推荐

