8

Google を実際に呼び出すことなく、AdWords API に接続するコードをテストしたい (費用がかかります ;))。TrafficEstimatorServiceInterface の新しい実装をプラグインする方法はありますか?

AdWords クライアント API は依存性注入に Guice を使用していますが、変更するためにインジェクターを取得する方法がわかりません。

それが役立つ場合、これは私が今それを実装する方法です:

AdWordsServices adWordsServices = new AdWordsServices();
AdWordsSession session = AdwordsUtils.getSession();

TrafficEstimatorServiceInterface trafficEstimatorService =
    adWordsServices.get(session, TrafficEstimatorServiceInterface.class);
4

2 に答える 2

0

この目的には、テスト アカウントを使用する必要があります。また、 2013 年 3 月 1 日以降、AdWords API の使用は無料になりますが、ツールの開発中は引き続きテスト アカウントを使用する必要があります。

于 2013-02-26T23:06:58.470 に答える
0

Google API オブジェクトのテスト実装 (モック / スタブ) をテスト コードに挿入する必要があります。Google が内部的に使用する Guice インジェクションは、ここでは関係ありません。

コードをファクトリからTrafficEstimatorServiceInterfaceフェッチするのではなく、実行時にコードを依存させて注入する必要があります。次に、単体テストで、モックまたはスタブを挿入できます。TrafficEstimatorServiceInterfaceAdWordsServices

たとえば、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);
        }
    }
}
于 2017-11-24T09:55:34.500 に答える