2017-06-11 7 views
2

dagger2を使用しているユースケース(MVPアーキテクチャの場合)でjunitテストを行っています。 問題は私のjunitテストケースの中でDagger2注入を使いたいときがあります。 だから私はこのためにDaggerMockライブラリを調べました。私は私のために構築したいと思う特定の依存関係を持っていますが、それはnullを返し続けます。 まず、短剣をどのように設定するかを教えてください。DaggerMock - テストケースでオブジェクトを提供するために短剣を取得する方法

その単一コンポーネント(サブコンポーネントを試みたが、daggerMockはそれで幸せではなかった): AppComponent.java:

@Singleton 
@Component(modules = {AppModule.class, NetworkModule.class, RepositoryModule.class, UseCaseModule.class, ActivityModule.class, PresenterModule.class}) 
public interface AppComponent { 
    void inject(NetworkSessionManager target); 
    void inject(SplashActivity target); 
    void inject(AuthenticationActivity target); 
    void inject(WelcomeActivity target); 
    void inject(LoginFragment target); 
} 

クラスの残りの部分は@Injectで注釈を付けています。 @Injectでクラスコンストラクタをアノテートすると、上記のAppComponentインタフェースで のdelcareをしなくてもいいということです。だからここ

はDaggerMockと私のテストケースである:

@Rule 
    public final DaggerMockRule<AppComponent> rule = new DaggerMockRule<>(AppComponent.class, new AppModule(null),new RepositoryModule(),new NetworkModule(),new UseCaseModule()); 


    StandardLoginInfo fakeLoginInfo; 
    TestObserver<Login> subscriber; 

    DoStandardLoginUsecase target_standardLoginUsecase;//this is what im trying to test so its real 

    @InjectFromComponent 
    UserDataRepository userDataRepository; //id like this to be a real instance also but it keeps showing as null 

    @Before 
    public void setUp() throws Exception { 

     target_standardLoginUsecase = new DoStandardLoginUsecase(userDataRepository); // this gets passed a null, why ? 
     subscriber = TestObserver.create(); 
    } 

//.... 

} 

私たちは私は私が私が利用可能なすべての依存関係を持っていることを考えていたので、私はappcomponentからすべての私のモジュールが含まれて定義されたルールを見れば。 私は予想されるコンテキストとしてAppModuleにnullを渡しましたが、それは大きな問題ではないと思います。

私は@InjectFromComponent注釈が私に欲しいものを与えてくれました。私も@InjectFromComponent(DoStandardLoginUsecase.class)しようとしましたが、それは動作しません。私はそれがAppComponentに入ることを望みます。 私はUserDataRepositoryオブジェクトを構築します。私はDaggreMockRuleのすべてのモジュールを使用しているので、これを行うのは苦労しないと思いましたか?

私は実際のオブジェクトを構築するためにdagger2を取得できますか?

答えて

1

ここでのトリックは、注入したいものがコンポーネントに直接公開されていなければならないということです。たとえば、次のようなコンポーネントを使用します。

@Singleton 
@Component(modules = {AppModule.class, TestNetworkModule.class, RepositoryModule.class, ActivityModule.class}) 
public interface TestAppComponent { 

    void inject(LoginFragment target); 
    void inject(SignUpFragment target); 

    MockWebServer server(); 
    UserDataRepository userDataRepo(); //these two can be injected because they are directly exposed (still put them in your module as usual. this just directly exposes them so daggermock can use them) 
} 
関連する問題