【问题标题】:Android Test with Dagger mock inject constructor使用 Dagger 模拟注入构造函数进行 Android 测试
【发布时间】:2017-01-29 10:53:14
【问题描述】:

您好,我遇到了以下问题。我想用 espresso 为 Ui 编写 android 测试,并且为了让测试不是片状的,我想模拟我的演示者。

我在应用程序中使用 Dagger。我的配置如下:

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

我有一个组件的模块

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

那么我还有一个用于活动的组件,该组件带有一个模块

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

然后我的页面有子组件

@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);
    }
}

然后detail Activity注入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 等。而且一些数据层也有注入依赖,所以我也不能模拟它们。

提前谢谢你

【问题讨论】:

    标签: android mockito dagger-2 dagger android-espresso


    【解决方案1】:

    DetailPresenter 类是在InfoModule 中创建的,因此您不需要Inject 注释。您得到的错误是因为使用 DaggerMock 您只能替换在模块中创建的对象。在您的示例中,您已经在模块中创建它,您只需要删除 Inject 注释。

    【讨论】:

    • 我得到了同样的错误,我尝试删除 Inject 但仍然得到同样的错误。可能是其他原因,我们是否需要为每个活动模块创建规则,如这个 Rule public final DaggerMockRule 规则=新 EspressoDaggerMockRule();或仅适用于应用程序组件
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多