Java:如何对使用REST服务的抽象类进行单元测试

Java:如何对使用REST服务的抽象类进行单元测试,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有两节课。第一个ServiceConsumer是一个抽象类,用于初始化其构造函数中的服务器设置。它具有使用REST服务的受保护方法 public abstract class ServiceConsumer { public ServiceConsumer(String configFilePath) { initConfigSuccessful = false; initConfiguration(configFilePath); } protected RestResp

我有两节课。第一个
ServiceConsumer
是一个抽象类,用于初始化其构造函数中的服务器设置。它具有使用REST服务的受保护方法

public abstract class ServiceConsumer {

public ServiceConsumer(String configFilePath) {
    initConfigSuccessful = false;
    initConfiguration(configFilePath);
}

protected RestResponse executeGetRequest(String urlString) {
    if (!initConfigSuccessful) {
        return RestResponseFactory.createErrorResponse("Initialization error!");
    }

    try {
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpGet getRequest = new HttpGet(urlString);
        byte[] authentication = Base64.getEncoder().encode((username + ":" + password).getBytes());
        getRequest.setHeader("Authorization", "Basic " + new String(authentication));

        HttpResponse response = httpClient.execute(getRequest);
        HttpEntity entity = response.getEntity();
        InputStream responseStream = entity.getContent();
        String responseString = StringHelper.getFileContent(responseStream);
        JsonElement responseElement = new JsonParser().parse(responseString);
        int responseCode = response.getStatusLine().getStatusCode();

        if (responseElement == null || responseElement.isJsonNull()) {
            return RestResponseFactory.createResponse(responseCode);
        } else if (responseElement.isJsonObject()) {
            return RestResponseFactory.createResponse(responseCode, responseElement.getAsJsonObject());
        } else if (responseElement.isJsonArray()) {
            return RestResponseFactory.createResponse(responseCode, responseElement.getAsJsonArray());
        }
    } catch (Exception e) {
        return RestResponseFactory.createErrorResponse(e);
    }
    return RestResponseFactory.createErrorResponse("Unexpected error occured!");
    }
}
第二个类
ServiceClient
扩展了
ServiceConsumer
,并调用方法超级构造函数和方法

public class ServiceClient extends ServiceConsumer {

private static String configFilePath = "/server-config.json";

public ServiceClient() {
    super(getConfigFilePath());
}

public RestResponse getStuffByKey(String key) {
    RestResponse restResponse = executeGetRequest(getBasicUrl() + "/rest/api/2/stuff/" + key);
    return restResponse;
    }
}
我不知道如何用Mockito进行单元测试。感谢您的帮助。

解决方法是选择组合而不是继承<代码>服务消费者正在提供要调用的功能。但是没有理由将该功能放在基类中。将其移动到自己的类中,用接口抽象该功能,并让
ServiceClient
依赖于该接口

您的代码显示了类设计的明确警告标志:您的派生类正在调用基类的非抽象保护方法。

答案是支持组合而不是继承<代码>服务消费者正在提供要调用的功能。但是没有理由将该功能放在基类中。将其移动到自己的类中,用接口抽象该功能,并让
ServiceClient
依赖于该接口


您的代码显示了类设计的明确警告标志:您的派生类正在调用基类的非抽象保护方法。

您要测试哪些操作?getStuffByKey和/或executeGetRequest方法。您要测试哪些操作?getStuffByKey和/或executeGetRequest方法。感谢您的回答,但我不确定我是否理解。你能更具体一点我要做什么吗?谢谢你的回答,但我不确定我是否理解。你能更具体一点我要做什么吗?