我试图为下面的方法编写一个测试用例,我需要模拟从弹性搜索数据库获得的响应。
@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
}
}发布于 2022-03-31 06:09:05
有一个解决办法,您可以使用模拟静态(签出) RestHighLevelClient来模拟创建https://mvnrepository.com/artifact/org.mockito/mockito-inline对象的静态方法。
我正在使用Gradle testImplementation '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);
}
}https://stackoverflow.com/questions/71686750
复制相似问题