2015-04-29 3 views
1

Я работаю над компонентом, который динамически создает запросы HTTP, и я хотел бы быть в состоянии имитировать эти запросы для модульного тестирования.Инъекционная зависимость с Guice в методе неконструктора

В настоящее время реализация выглядит следующим образом:

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

Есть ли способ использовать 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(); 
    } 
} 

Но это в основном, как с помощью завод, который пропускает точку Guice полностью.

+0

Рассмотрите возможность использования [Jukito] (https://github.com/ArcBees/Jukito). Он объединяет Guice, JUnit и Mockito в единую структуру. – durron597

ответ

6

Вы можете ввести поставщика, который предоставляет экземпляры HTTPRequest в вашем коде.

class ModelClass { 

    @Inject 
    Provider<HTTPRequest> httpRequestProvider; 

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

} 

Затем в тестовом коде, вы можете дразнить «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) 

Информация о инъекционных поставщиках: https://github.com/google/guice/wiki/InjectingProviders

+1

+1, но вы можете использовать ['Providers.of (yourMockHTTPRequestObject)'] (http://google.github.io/guice/api-docs/3.0/javadoc/com/google/inject/util/Providers.html #of (T)), чтобы пропустить дополнительный макет. –