如何模拟 JestClient、elasticSearch
How to mock JestClient, elasticSearch
我想模拟 jest 客户端,这样我就可以测试
@Override
public List<Person> findAll() {
SearchResult result = null;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(personIndexName)
.addType(personTypeName).build();
try {
result = client.execute(search);
if (!result.isSucceeded()) {
return null;
}
} catch (IOException e) {
logger.error("The search can't be completed " + e.getMessage());
}
List<SearchResult.Hit<Person, Void>> hits = result.getHits(Person.class);
return hits.stream().map(this::getPerson).collect(Collectors.toList());
}
我想模拟 jest 以便它抛出 IOException 并进行一些其他测试,我试过这样模拟:
when(mockJestClient.execute(search)).thenThrow(IOException.class);
when(mockJestClient.execute(null)).thenThrow(IOException.class);
elasticsearchPersonRepository = new ElasticsearchPersonRepository(mockJestClient);
没用,当我调用测试
@Test(expected = IOException.class)
public void findAll() throws Exception {
elasticsearchPersonRepository.findAll();
}
它抛出空指针异常而不是IOExcept。
我究竟做错了什么?我如何模拟 JestClient?
您不应使用 'search' 或 'null',而应使用特殊的 'any' 参数执行。如果是Mockito(其他mock框架也有类似的功能)
when(mockJestClient.execute(ArgumentMatchers.any(Search.class))).thenThrow(IOException.class);
我想模拟 jest 客户端,这样我就可以测试
@Override
public List<Person> findAll() {
SearchResult result = null;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(personIndexName)
.addType(personTypeName).build();
try {
result = client.execute(search);
if (!result.isSucceeded()) {
return null;
}
} catch (IOException e) {
logger.error("The search can't be completed " + e.getMessage());
}
List<SearchResult.Hit<Person, Void>> hits = result.getHits(Person.class);
return hits.stream().map(this::getPerson).collect(Collectors.toList());
}
我想模拟 jest 以便它抛出 IOException 并进行一些其他测试,我试过这样模拟:
when(mockJestClient.execute(search)).thenThrow(IOException.class);
when(mockJestClient.execute(null)).thenThrow(IOException.class);
elasticsearchPersonRepository = new ElasticsearchPersonRepository(mockJestClient);
没用,当我调用测试
@Test(expected = IOException.class)
public void findAll() throws Exception {
elasticsearchPersonRepository.findAll();
}
它抛出空指针异常而不是IOExcept。 我究竟做错了什么?我如何模拟 JestClient?
您不应使用 'search' 或 'null',而应使用特殊的 'any' 参数执行。如果是Mockito(其他mock框架也有类似的功能)
when(mockJestClient.execute(ArgumentMatchers.any(Search.class))).thenThrow(IOException.class);