Java模拟私人最终字段或响应表单RestHighLevelClient



我正试图为下面的方法编写一个测试用例,我需要模拟从弹性搜索数据库中获得的响应。

@Inject
ESEntity mockElasticSearchEntity;
private final RestHighLevelClient restHighLevelClient = OpenSearchRestHighLevelClient.getRestHighLevelClient();
public String getAllMoviesListResult(String index){
SourceBuilder sourceBuilder = entity.createElasticSearchQueryForGetAllMovieList();
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOption.DEFAULT);
return searchResponse.getHits().get(0);
}

我已经编写了以下测试用例:代码流到RestHighLevelClient类并返回NullPointException,而不是获得模拟响应。

@InjectMock
ESEntity mockElasticSearchEntity;
@Test
public void testgetAllMoviesListResult(){
ESEntity elasticSearchEntity = new ESearchEntity();
SearchSourceBuilder sourceBuilder = elasticSearchEntity.createElasticSearchQueryForGetAllMovieList();
when(mockElasticSearchEntity.createElasticSearchQueryForGetAllMovieList()).thenReturn(sourceBuilder);

String esReponse ="";
JsonXContentParser xContentParser = new JsonXContentParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, new JsonFactory().createParser(esResponse));
SearchResponse searchResponse = SearchResponse.fromXContent(xContentParser);
RestHighLevelClient mockRestHighLevelClient = mock(RestHighLevelClient.class);
when(mockRestHighLevelClient.search(any(),any())).thenReturn(searchResponse);

String actualResponse = new EntityService().getAllMoviesListResult("someIndex");

}

我搜索了类似的问题,但这需要使用PowerMock,我目前使用的框架不支持它。

更新

public class OpenSearchRestHighLevelClient {
private static RestHighLevelClient restHighLevelClient = null;

public static RestHighLevelClient getRestHighLevelClient() {     
//singleton implementation on receiving the RestHighLevelClient.
if(restHighLevelClient==null) {
restHighLevelClient = createRestHighLevelClient();
}
return restHighLevelClient;
}

public static RestHighLevelClient createRestHighLevelClient(){
//logic to create RestHighLevelClient
}
}

我能想到一种变通方法,可以使用mock static(checkout(模拟RestHighLevelClient的静态对象创建方法https://mvnrepository.com/artifact/org.mockito/mockito-inline

我正在使用GradletestImplementation 'org.mockito:mockito-inline:3.4.6'这对我有效,让我知道

@Test
public void testgetAllMoviesListResult() {
ESEntity elasticSearchEntity = new ESearchEntity();
SearchSourceBuilder sourceBuilder = elasticSearchEntity.createElasticSearchQueryForGetAllMovieList();
when(mockElasticSearchEntity.createElasticSearchQueryForGetAllMovieList()).thenReturn(sourceBuilder);
String esReponse = "";
JsonXContentParser xContentParser = new JsonXContentParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, new JsonFactory().createParser(esResponse));
SearchResponse searchResponse = SearchResponse.fromXContent(xContentParser);
RestHighLevelClient mockRestHighLevelClient = mock(RestHighLevelClient.class);
when(mockRestHighLevelClient.search(any(), any())).thenReturn(searchResponse);

try (MockedStatic<OpenSearchRestHighLevelClient> openSearchRestHighLevelClient = mockStatic(OpenSearchRestHighLevelClient.class)) {
openSearchRestHighLevelClient.when(OpenSearchRestHighLevelClient::getRestHighLevelClient).thenReturn(mockRestHighLevelClient);
String actualResponse = new EntityService().getAllMoviesListResult("someIndex");
assertEquals(expectedResponse, actualResponse);
}
}

最新更新