在非构造函数方法中使用 Guice 注入依赖

Injecting dependency with Guice in non-constructor method

我正在开发一个动态创建 HTTP 请求的组件,我希望能够模拟这些请求以进行单元测试。

目前的实现看起来像这样:

class ModelClass {
     public void populate() {
          HTTPRequest request = new HTTPRequest();
          //configure request...
          request.send();
     }
}

有没有一种方法可以使用 Guice 来实例化 request,以便我可以将其替换为模拟 class 的实例以进行测试?我能想到的最接近的方法是添加一个注入器作为 ModelClass 的实例变量:

class ModelClass {
     private final Injector injector;

     ModelClass(Injector injector){
          this.injector = injector;
     }

     public void populate() {
          HTTPRequest request = injector.getInstance(HTTPRequest.class);
          //configure request...
          request.send();
     }
}

但这基本上就像使用工厂一样,完全没有抓住 Guice 的要点。

您可以在您的代码中注入提供 'HTTPRequest' 个实例的提供程序。

class ModelClass {

   @Inject
   Provider<HTTPRequest> httpRequestProvider;

   public void populate() {
      HTTPRequest request = httpRequestProvider.get();
   }

}

然后,在您的测试代码中,您可以模拟 'httpRequestProvider' 到 return 模拟 'HTTPRequest' 个实例。

Provider<HTTPRequest> mockHttpRequestProvider = mock(Provider.class);
when(mockHttpReqestProvider.get()).thenReturn(yourMockHTTPRequestObject);
// Set this mock provider to the ModelClass instance. (You may have to use reflection)

关于注入提供者的信息:https://github.com/google/guice/wiki/InjectingProviders