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