Google API オブジェクトのテスト実装 (モック / スタブ) をテスト コードに挿入する必要があります。Google が内部的に使用する Guice インジェクションは、ここでは関係ありません。
コードをファクトリからTrafficEstimatorServiceInterface
フェッチするのではなく、実行時にコードを依存させて注入する必要があります。次に、単体テストで、モックまたはスタブを挿入できます。TrafficEstimatorServiceInterface
AdWordsServices
たとえば、Martin Fowler による「 Inversion of Control Containers and the Dependency Injection pattern 」を参照してください。
これが実際にどのように見えるかは、アプリケーションの実行に使用している IoC コンテナーによって異なります。Spring Boot を使用していた場合、これは次のようになります。
// in src/main/java/MyService.java
// Your service code, i.e. the System Under Test in this discussion
@Service
class MyService {
private final TrafficEstimatorServiceInterface googleService;
@Autowired
public MyService (TrafficEstimatorServiceInterface googleService) {
this.googleService = googleService;
}
// The business logic code:
public int calculateStuff() {
googleService.doSomething();
}
}
// in src/main/java/config/GoogleAdsProviders.java
// Your configuration code which provides the real Google API to your app
@Configuration
class GoogleAdsProviders {
@Bean
public TrafficEstimatorServiceInterface getTrafficEstimatorServiceInterface() {
AdWordsServices adWordsServices = new AdWordsServices();
AdWordsSession session = AdwordsUtils.getSession();
return adWordsServices.get(session, TrafficEstimatorServiceInterface.class);
}
}
// in src/test/java/MyServiceTest.java
// A test of MyService which uses a mock TrafficEstimatorServiceInterface
// This avoids calling the Google APIs at test time
@RunWith(SpringRunner.class)
@SpringBootTest
class MyServiceTest {
@Autowired
TrafficEstimatorServiceInterface mockGoogleService;
@Autowired
MyService myService;
@Test
public void testCalculateStuff() {
Mockito.when(mockGoogleService.doSomething()).thenReturn(42);
assertThat(myService.calculateStuff()).isEqualTo(42);
}
@TestConfiguration
public static class TestConfig {
@Bean()
public TrafficEstimatorServiceInterface getMockGoogleService() {
return Mockito.mock(TrafficEstimatorServiceInterface.class);
}
}
}