2016-09-21 7 views
3

こんにちは私は次の問題があります。私はUiのためにエスプレッソでアンドロイドテストを書いていて、フレークではないテストをするためにプレゼンターを嘲笑したいと思っています。Android Test with Daggerモック注入コンストラクタ

私はアプリでDaggerを使用しています。その後、

@PerActivity 
@Component(dependencies = AppComponent.class, modules = ActivityModule.class) 
public interface ActivityComponent { 
    //inject activites 
    //provide subcomponents for activites 
} 

コンポーネントのため、私はその後、私はまた、モジュールとの活動のためのコンポーネントを持っているコンポーネント

@Module 
public class AppModule { 
    //providings for component 
} 

ためのモジュールを持って

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 
    //some injections 
    //some providings 
} 

:私の構成には、以下の通りです私のページのサブコンポーネントがあります

@PerActivity 
@Subcomponent(modules = InfoModule.class) 
public interface InfoComponent { 
    void inject(DetailActivity activity); 
} 

と副成分

@Module 
public class InfoModule { 

    @Provides 
    public DetailPresenter provideDetailPresenter(ShowDetailsUseCase showDetailsUseCase, 
             OtherUseCase getPoisUseCase, 
             AccountManager accountManager, Navigator 
               navigator) { 
     return new DetailPresenter(showDetailsUseCase, otherUseCase, accountManager, navigator); 
    } 
} 

するためのモジュールと、次に詳細アクティビティDetailPresenter

public class DetailActivity extends BaseActivity { 

    @Inject 
    DetailPresenter mPresenter; 

    InfoComponent mComponent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mComponent = getActivityComponent().provideInfoModule(new InfoModule()); 
     mComponent.inject(this); 
     mPresenter.bindView(this); 
     mPresenter.onCreate(new PresenterBundle(getIntent().getExtras(), savedInstanceState)); 
    } 
    //functionality of detailActiviy 
} 

を注入し、私が試験に今コンストラクタ注入

public class DetailPresenter extends BasePresenter { 


    private ShowDetailsUseCase mDetailsUseCase; 
    private final OtherUseCase getPoisUseCase; 

    private AccountManager accountManager; 
    private Navigator navigator; 

    @Inject 
    public DetailPresenter(ShowDetailsUseCase getDetailsUseCase, OtherUseCase getPoisUseCase, 
    AccountManager 
    accountManager, Navigator navigator) { 
     this.mDetailsUseCase = getDetailsUseCase; 
     this.getPoisUseCase = gotherUseCase; 
     this.accountManager = accountManager; 
     this.navigator = navigator; 
    } 

    @Override 
    public void onCreate(@Nullable PresenterBundle bundle) { 
     super.onCreate(bundle); 
     //other things to do on initialization 
     ((DetailView) getView()).showDetails(getDetailsFromUseCase()); 

    } 
} 

を使用するプレゼンタを有します私は司会者を嘲笑したい:

@RunWith(AndroidJUnit4.class) 
public class DetailActivityTest { 

    @Rule 
    public final ActivityTestRule<DetailActivity> main = new ActivityTestRule<DetailActivity>(DetailActivity.class, true, false); 

    @Rule 
    public final DaggerMockRule<AppComponent> rule=new EspressoDaggerMockRule(); 

    @Mock 
    DetailPresenter presenter; //does not work because @Inject constructor 


    @Test 
    public void locationTest() { 

     Details details = generateDetails(); 

     launchActivity(); 

     doAnswer(answer -> { 
        activity.showDetails(details); 
        return null; 
       } 

     ).when(presenter).onCreate(any()); 

     //espresso verify afterwards 
    } 
} 

が、私は次のエラーを模擬しようとした場合には示しています

java.lang.RuntimeException: Error while trying to override objects: 
a.b.c.ui.mvp.presenter.DetailPresenter 
You must define overridden objects using a @Provides annotated method instead of using @Inject annotation 

誰かが私も@Injectコンストラクタと依存関係でプレゼンターを模擬することができる午前どのようにアイデアを持っているん。 私はデータレイヤーを模擬したくありません。なぜなら、データベース、apiClient、cacheDataなどをモックする必要があるからです。また、データレイヤーの中には依存性があるものもありますので、私はそれらをモックできません。

あなたがInject注釈を必要としないので、DetailPresenterクラスは、InfoModuleに作成され、事前に

答えて

1

、ありがとうございました。 DaggerMockを使用すると、モジュールで作成されたオブジェクトだけを置き換えることができるため、エラーが発生します。あなたの例では既にモジュールでそれを作成していますが、Injectアノテーションを削除するだけで済みます。

+0

私は同じエラーが発生していますが、私はインジェクションを削除しようとしましたが、同じエラーが発生しました。他の理由もありますし、このルールのようなアクティビティモジュールごとにルールを作成する必要があります。 public final DaggerMockRule rule = new EspressoDaggerMockRule();またはアプリケーションコンポーネントのみの場合 –

関連する問題