java - Mockito doReturn 抛出空指针异常
问题描述
我试图在另一个名为 DiscoveryAdapter 的类中模拟来自名为 RestClient 的类的方法调用,但是当我尝试执行 doReturn 时,它会引发空指针异常。在测试中,我试图监视 restClient 对象以模拟 DiscoveryAdapter.discovery 方法中的方法调用,但是在调用 doReturn 时它会引发空指针异常。请检查下面的代码。
RestClient.class
@Component
@Scope("prototype")
public class RestClient {
private static final Logger logger = LoggerFactory.getLogger(RestClient.class);
private RestTemplate restTemplate = null;
private PoolingHttpClientConnectionManager syncConnectionManager;
public void init() {
restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(buildhttpClient()));
}
public String queryRestEndpoints(HereMapsImpl mapType,String basePath,boolean isSSl) {
URI uriObject = null;
String uriPath = mapType.returnUri();
init();
try {
uriObject = RestUtils.buildUriFromString(basePath, isSSl, uriPath);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.info("rest api is {}",uriObject);
//spring api
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> requestEntity = new HttpEntity<String>("",headers);
//rest api call with uriObject
ResponseEntity<String> responseEntity = restTemplate.exchange(uriObject,
HttpMethod.GET, requestEntity, String.class);
if(responseEntity.getStatusCodeValue() >=400 || responseEntity.getStatusCodeValue() <= 500)
logger.info("failed with status code {}",responseEntity.getStatusCodeValue() );
logger.info("checking my response");
logger.info("checking my response here {}",responseEntity.getBody());
return responseEntity.getBody();
}
private CloseableHttpClient buildhttpClient() {
CloseableHttpClient httpClient = null;
httpClient = HttpClientBuilder.create().setConnectionManager(getSyncConnectionManager())
.build();
return httpClient;
}
public PoolingHttpClientConnectionManager getSyncConnectionManager() {
syncConnectionManager = new PoolingHttpClientConnectionManager();
return syncConnectionManager;
}
DisoveryAdapter.class
@Component
public class DisoveryAdapter {
private static final Logger log = LoggerFactory.getLogger(DisoveryAdapter.class);
@Autowired
private RestClient restClient;
public void discovery() {
log.info("starting thread");
String response = restClient.queryRestEndpoints(eatDrink, completeUriPath, true);
log.info("oeat drink response {}",response);
}
}
DiscoveryAdapterTest.class
class HereMapsCheckImpTest {
private static final Logger log = LoggerFactory.getLogger(HereMapsCheckImpTest.class);
private RestClient restClient;
private HereMapsCheckImp hereMaps;
@Before
public void init() {
hereMaps = new HereMapsCheckImp();
restClient = new RestClient();
}
@Test
public void test() {
RestClient spyRestClient = spy(restClient);
log.info("with spring {}",spyRestClient);
doReturn("{\n" +
" color: \"red\",\n" +
" value: \"#f00\"\n" +
"}").when(spyRestClient).queryRestEndpoints(any(),any(),any());
hereMaps.discovery();
verify(spyRestClient).queryRestEndpoints(any(),any(),any());
}
}
解决方案
推荐阅读
- android - 为什么第一次发送消息时,聊天应用程序中发送的消息会重复?
- javascript - 退出页面重定向,确认框离开并取消 javascript。如何实现?
- git - 如何在 Visual Studio 2017 项目中添加 .git 目录
- c - 编译器错误作为“对成员“价格”的请求,而不是结构或联合”
- linux - 检查新上传的文件并在bash脚本中重定向其他文件中的文件数据?
- python - 插入sql表时跳过文本文件的第一行
- android - Android RuntimeException 无法解析 android.content.res.TypedArray.getColor 索引 24 处的属性
- windows - Azure CLI 2 身份验证在本地存储在哪里?
- sql - SQL,给数据库记录值并检查它们是否存在
- regex - TypeDoc 以及如何仅从少数路径中排除 *.d.ts 文件