2015-03-25 14 views
5

Tôi sử dụng Dagger2 trong ứng dụng Android của mình. Về cơ bản tôi tiêm HttpClient (giao diện) vào MainActivity.Mô-đun thử nghiệm tiêm với dagger2

@Module 
public class MainActivityModule{ 

    @Provides public HttpClient providesHttpComponent(){ 
     return new RealHttpClient(); 
    } 
} 

@Component(modules = MainActivityModule.class) 
public interface MainActivityComponent { 
    public MainActivity injectActivity(MainActivity); 
} 



public class MainActivity extends Activity { 

    public void onCreate(Bundle saved){ 
     super.onCreate(); 

     injectDependencies(); 
    } 


    protected void injectDependencies(){ 

     Dagger_MainActivityComponent 
     .builder() 
     .mainActivityComponent(new MainActivityModule()) 
     .build() 
     .injectActivity(this); 
    } 

} 

Cho đến giờ rất tốt, hoạt động như mong đợi. Bây giờ tôi muốn viết một số bài kiểm tra đơn vị (không phải thử nghiệm thiết bị đo đạc android) cho MainActivity nơi tôi muốn sử dụng TestMainActivityModule thay vì MainActivityModule.

@Module (overrides = true) 
public class TestMainActivtiyModule extends MainActivityModule { 

    @Provides public HttpClient(){ 
     return new MockHttpClient(); 
    } 

} 

Câu hỏi của tôi là: Làm thế nào để buộc MainActivity sử dụng TestMainActivitiyModule thay vì MainActivityModule? Có một giải pháp tốt cho điều đó không?

cách tiếp cận hiện tại của tôi là sử dụng thừa kế và để ghi đè getModule(), một cái gì đó như thế này

public class TestMainActivity extend MainActivity { 

    @Override 
    protected void injectDependencies(){ 

     Dagger_MainActivityComponent 
     .builder() 
     .mainActivityComponent(new TestMainActivtiyModule()) 
     .build() 
     .injectActivity(this); 
    } 
} 

và chạy thử nghiệm đơn vị chống TestMainActivity thay vì MainActivity.

Tôi đoán nó hoạt động, nhưng một trong những vấn đề tôi phải đối mặt với phương pháp này là tôi không thể bắt đầu TestMainActivity với một Intent vì tôi không thể xác định nó trong AndroidManifest.xml

Có ai biết một tốt hơn cách tiếp cận để thử nghiệm đơn vị với dagger2 trên Android?

+1

Là nhận xét ban đầu, ghi đè mô-đun không phải là điều trong dao găm 2.Phương pháp là có để không phá vỡ sự biên dịch trong khi mọi người đang di chuyển, nhưng không được chấp nhận và không có hiệu lực đối với dự án dagger 2. –

Trả lời

0

Cách tiếp cận tôi đã bắt đầu sử dụng có liên quan đến việc duy trì hai mô-đun (một cho ứng dụng, một để thử nghiệm) trong các biến thể xây dựng song song (ví dụ: appintegration). Vẫn không chắc chắn giải pháp đó có hiệu quả như thế nào với YMMV. Tôi rất vui khi thấy một giải pháp tốt hơn!

Đây cũng là một đọc lớn: http://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

+2

Tôi thích có hai mô-đun tách rời, vì vậy, bài đăng trên blog circle.com không phải là những gì tôi muốn (vì tôi không muốn phụ thuộc chế nhạo trong ứng dụng phát hành của mình). Phương pháp xây dựng các biến thể âm thanh tốt hơn, nhưng vẫn không hoàn hảo ... – sockeqwe

0

tôi thực sự sẽ đề nghị bạn để kiểm tra boilerplate này vì nó hoàn toàn dựa trên DI sử dụng Dagger2. Nó cũng cho thấy làm thế nào bạn có thể thay thế phụ thuộc của bạn trong môi trường thử nghiệm một cách rất gọn gàng.

Các phụ thuộc hiện đang xử lý bởi các tấm nồi hơi như sau:

  • Cơ sở dữ liệu phụ thuộc: gói gọn tất cả các hoạt động cơ sở dữ liệu.
  • Phụ thuộc tùy chọn được chia sẻ: thỏa thuận với tùy chọn được chia sẻ.
  • Phụ thuộc vào tệp cục bộ: liên quan đến lưu trên tệp.
  • phụ thuộc Analytics: bao gồm tất cả các hoạt động của báo cáo các sự kiện để phân tích của bạn backend (GA, Segment, FB, Flurry ..)
  • Logging phụ thuộc: gói gọn tất cả các hoạt động liên quan đến khai thác gỗ để giao diện điều khiển của bạn
  • Api phụ thuộc: đóng gói tất cả các hoạt động liên quan đến API

Sức mạnh của tiêm phụ thuộc thực sự dễ dàng chuyển đổi phụ thuộc của bạn trong môi trường thử nghiệm thành phụ thuộc giả.

Các vấn đề liên quan