2013-02-26 48 views
7

Tôi muốn kiểm tra mã của mình kết nối với AdWords API mà không thực hiện cuộc gọi thực sự tới Google (chi phí tiền;)). Bất kỳ ý tưởng làm thế nào tôi có thể cắm vào một thực hiện mới của TrafficEstimatorServiceInterface?giả lập adwords api

API khách hàng AdWords đang sử dụng Guice để tiêm phụ thuộc, nhưng tôi không chắc chắn làm thế nào tôi có thể nhận được giữ của các Injector để sửa đổi nó ?!

Nếu nó giúp, đây là làm thế nào tôi có được thi hành ngay:

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

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

Thay vì cách thay đổi guice, bạn có thể thử phương pháp của mình bằng cách thực hiện riêng TrafficEstimatorServiceInterface và ghi lại hoạt động nào đang chạy nó? –

Trả lời

0

Bạn nên sử dụng một test account cho mục đích này. Ngoài ra, sẽ không còn là charge for using the AdWords API kể từ ngày đầu tiên của tháng 3 năm 2013, nhưng bạn vẫn nên tiếp tục sử dụng tài khoản thử nghiệm trong khi phát triển công cụ của mình.

+2

Phần lớn đây là thông tin hữu ích, câu hỏi cụ thể hỏi cách kiểm soát tiêm phụ thuộc Guice để google không * được liên hệ. Tôi đoán đơn vị thử nghiệm như trái ngược với thử nghiệm tích hợp. –

0

Bạn cần phải thực thi thử nghiệm (mô phỏng/sơ khai) của các đối tượng API Google vào mã thử nghiệm của mình. Công cụ tiêm Guice mà Google sử dụng nội bộ không có liên quan ở đây.

Bạn nên làm cho mã của mình tùy thuộc vào TrafficEstimatorServiceInterface và tiêm mã đó khi chạy, thay vì để mã của bạn tìm nạp TrafficEstimatorServiceInterface từ nhà máy AdWordsServices. Sau đó, trong các bài kiểm tra đơn vị của bạn, bạn có thể tiêm một mô hình hoặc sơ khai.

Xem ví dụ "Inversion of Control Containers and the Dependency Injection pattern" của Martin Fowler.

Cách thức này sẽ được thực hiện cho bạn tùy thuộc vào vùng chứa IoC bạn đang sử dụng để chạy ứng dụng của bạn. Nếu bạn đang sử dụng Khởi động mùa xuân, điều này có thể trông giống như sau:

// 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); 
     } 
    } 
} 
Các vấn đề liên quan