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

sak*_*sak 2 java tdd mocking guice roboguice

我正在研究一个动态创建HTTP请求的组件,我希望能够模拟这些单元测试请求.

目前实现看起来像这样:

class ModelClass {
     public void populate() {
          HTTPRequest request = new HTTPRequest();
          //configure request...
          request.send();
     }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Guice实例化,request所以我可以用模拟类的实例替换它进行测试?我能想出的最近的是添加一个注入器作为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();
     }
}
Run Code Online (Sandbox Code Playgroud)

但这基本上就像使用工厂一样,完全错过了Guice的观点.

SPa*_*ama 7

您可以注入一个在代码中提供"HTTPRequest"实例的提供程序.

class ModelClass {

   @Inject
   Provider<HTTPRequest> httpRequestProvider;

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

}
Run Code Online (Sandbox Code Playgroud)

然后,在您的测试代码中,您可以模拟'httpRequestProvider'以返回模拟'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)
Run Code Online (Sandbox Code Playgroud)

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

  • +1,但你可以使用[`Providers.of(yourMockHTTPRequestObject)`](http://google.github.io/guice/api-docs/3.0/javadoc/com/google/inject/util/Providers.html# (T))跳过额外的模拟. (2认同)