You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:35:19