当前位置: 首页 > 知识库问答 >
问题:

注入HttpClient以使用GUICE在Java中获取模拟响应

戚鸿福
2023-03-14
    String strTemp = "";
        String sessionToken = "" ;
        HttpResponse response;
try { String url = String.format(URL_SESSION, email); HttpGet request = new HttpGet(url); <b>response = client.execute(request);</b> } catch (Throwable e) { LOG.error("Could not reach to the Server"); throw new ExecutionException(e, "Could not reach to the Server") .withReason(Throwables.getRootCause(e).getMessage()) .withResolution("Check if the outbound Port is open and you can reach the Rapportive service"); }
public abstract class MockHttpRequestBadQuery implements HttpClient {

    protected HttpResponse execute(HttpGet httpUriRequest) throws IOException {
        HttpResponse httpResponse = new BasicHttpResponse(new StatusLine() {
            @Override
            public ProtocolVersion getProtocolVersion() {
                return new ProtocolVersion("HTTP/1.1", 0, 0);
            }

            @Override
            public int getStatusCode() {
                return 400;
            }

            @Override
            public String getReasonPhrase() {
                return "Bad Request";
            }
        });
        HttpEntity entity = new StringEntity("{\"message\":\"\\n" +
                "SELECT badFieldName FROM Account\\n" +
                "       ^\\n" +
                "ERROR at Row:1:Column:8\\n" +
                "No such column \'badFieldName\' on entity \'Account\'. If you are attempting to use" +
                " a custom field, be sure to append the \'__c\' after the custom field name. Please" +
                " reference your WSDL or the describe call for the appropriate names.\"," +
                " \"errorCode\":\"INVALID_FIELD\"}");
        httpResponse.setEntity(entity);
        httpResponse.setHeader("Content-Type", "application/json;charset=UTF-8");
        httpResponse.setHeader("Date", "Tue, 28 May 2013 16:06:21 GMT");
        httpResponse.setHeader("Transfer-Encoding", "chunked");
        return httpResponse;
    }
}

共有1个答案

澹台蕴藉
2023-03-14

从您发布的代码中并不清楚真正的HttpClient依赖项是如何添加到真正的类中的。但以下是您可以在实际场景和测试场景中执行此操作的方法:

public class RealClassThatNeedsClientDep {

    @Inject private HttpClient client;

    public method useClient() {
        client.doStuff(); // client was injected at instance creation by Guice
    }

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new RealModule());
        injector.getInstance(RealClassThatNeedsClientDep.class).useClient();
    }
}

类有一个客户端作为注入的实例变量。如果该客户端类有一个默认的无参数构造函数,那么这就是您需要做的全部工作。如果没有,或者您希望将自定义逻辑应用于注入的客户机,那么您可以在realmodule中使用提供程序绑定客户机。注我不知道您使用的是哪种httpclient,所以下面的方法很可能是假的。

public class RealModule {
    /** provider only needed if HttpClient has no default no-args public constructor */
    @Provides HttpClient getClient() {
        return HttpClient.getNewInstance().customize();
    }
}

在您的测试模块中,您可以绑定一个用于注入的模拟客户端,并将测试模块安装到测试类中。

public class TestModule {

    @Provides HttpClient getClient() {
        // define mock client using Mockito or roll your own
    }
}
 类似资料:
  • 问题内容: 我有一个需要一些模块。有没有办法可以注入模块本身?我意识到这有点麻烦。 例: 我想在这种情况下,解决方案是将方法转换为完整的类。这显然是一个简化的示例;我正在处理的代码有很多这样的方法,因此将它们分成单独的类并引入配置它们的模块会增加相当多的混乱- 我认为Guice就是要减少样板混乱? 也许这反映了我对Guice的相对呆板,但是我遇到了很多尝试着做上述事情的案例。我肯定错过了什么… 问

  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 我想对我的服务进行单元测试。在我的服务中,我有一个构造函数,它是: ContractService.ts 我的模型看起来是这样的:(模型是来自sequelize-typescript的类) 所以我想用JEST创建我的单元测试。当我试图模仿contractModel时,它找不到方法,即使我试图模仿它。 我在想,怎样才是嘲弄这个合同模型的正确方法。

  • 我有一个小小的两难问题,涉及到Guice和避免非Guice单例。考虑一个多模块项目,其中有3个模块:、和。和都使用模块内的类的实例(该模块是times方法,并在整个项目中广泛使用)。 几乎每个类都需要使用这个实例(包括在用户连接时动态创建的对象)。 如果每个类都需要类的一个实例,那么不同的方法都有缺点: 解决方案2(仅作为实例字段): 缺点:与上面类似,您必须使用Guice的来实例化每个对象。这意

  • 我对webapi相当陌生,已经开发了一个小型webapi,它有一些操作并返回我的自定义类Response。 现在我遇到的困难是,我不知道如何读取从webapi操作返回的响应数据,并从我的响应类中提取json。在获得json之后,如何将该json 发送到customer类。 这就是我调用webapi函数的方式: null 1)如何在客户端获取webapi返回的响应类 2)如何从响应类中提取json

  • 我想在使用guice实例化子类时,将依赖项注入父类。在下面的示例中,我试图创建的一个实例,同时希望能够在运行时使用Guice注入。我该怎么做?