首页 > 解决方案 > 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());
    
}

}

标签: javaunit-testingjunitmockito

解决方案


推荐阅读