2013-02-26 11 views
7

Chcę przetestować mój kod, który łączy się z interfejsem API AdWords, bez wykonywania rzeczywistego połączenia z Google (to kosztuje;)). Każdy pomysł, jak mogę podłączyć nową implementację TrafficEstimatorServiceInterface?mock adwords api

Interfejs API klienta AdWords używa Guice do wstrzykiwania zależności, ale nie jestem pewien, w jaki sposób mogę uzyskać wstrzymanie wtryskiwacza w celu jego modyfikacji ?!

Jeśli to pomoże, to w jaki sposób mogę realizację teraz:

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

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

Zamiast zmienić sposób Guice jest wstrzykiwanie, można po prostu sprawdzić swoje metody, przekazując w swoim własnym realizacji TrafficEstimatorServiceInterface i nagrywanie jakie operacje są prowadzone na to? –

Odpowiedz

0

należy użyć test account do tego celu. Ponadto od 01 marca 2013 r. Nie będzie już charge for using the AdWords API, ale nadal należy korzystać z konta testowego podczas opracowywania narzędzia.

+2

Tak jak jest to użyteczne informacje, pytanie dotyczy sposobu sterowania wtryskiem zależności Guice, aby google * nie * skontaktował się z Tobą. Zakładam testy jednostkowe w przeciwieństwie do testów integracyjnych. –

0

Należy wprowadzić implementację testową (próbę/skrót) obiektów interfejsu API Google w kodzie testowym. Zastrzyk Guice, którego Google używa wewnętrznie, nie ma tu znaczenia.

Powinieneś sprawić, by twój kod był zależny od TrafficEstimatorServiceInterface i wstrzykiwać go w czasie wykonywania, zamiast pobierania kodu z fabryki TrafficEstimatorServiceInterface z fabryki TrafficEstimatorServiceInterface. Następnie w testach jednostkowych można wstrzyknąć próbę lub kod pośredniczący.

Zobacz na przykład "Inversion of Control Containers and the Dependency Injection pattern" autorstwa Martina Fowlera.

To, jak to będzie wyglądać w praktyce, zależy od tego, z jakiego kontenera IoC korzystasz do uruchamiania aplikacji. Jesli uzywasz Wiosna rozruchu, może to wyglądać mniej więcej tak:

// 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); 
     } 
    } 
}