更改 Espresso 的注入模块

Change injection modules for Espresso

我有一个可以调用 REST API 的应用程序。 我正在使用 Retrofit 来实现 API,我正在使用 Roboguice 在需要的地方注入我的 REST 服务。

我正在尝试使用浓缩咖啡编写测试套件。我想使用自定义注入模块,这样我就可以使用 Mockito 模拟 Retrofit 的响应。

如何更改我的测试套件以使用来自 Roboguice keeping espresso 的自定义注入模块。

PS:我已经了解了如何使用 Roboelectric 执行此操作,但我现在没有使用 Roboelectric。

我偶然发现了同样的问题,但我在网上找不到简单的解决方案。经过一天的尝试和失败,我终于找到了适合我的解决方案。

您需要声明自定义 ActivityTestRule class 以在 activity 启动之前覆盖应用程序注入器。这是一个例子:

@RunWith(AndroidJUnit4.class)
public class LoginActivityTest {

    protected final Api mApi = mock(Api.class);
    // declare the other mocks you want here
    protected final AbstractModule mTestModule = new MyTestModule();

    @Rule
    public ActivityTestRule<LoginActivity> mActivityRule = new RoboGuiceActivityTestRule<>(LoginActivity.class);

    private class RoboGuiceActivityTestRule<T extends Activity> extends ActivityTestRule<T> {

        public RoboGuiceActivityTestRule(Class<T> activityClass) {
            super(activityClass);
        }

        @Override
        protected void beforeActivityLaunched() {
            RoboGuice.overrideApplicationInjector((Application) InstrumentationRegistry.getTargetContext().getApplicationContext(), mTestModule);
        }
    }

    private class MyTestModule extends AbstractModule {

        @Override
        protected void configure() {
            bind(Api.class).toInstance(mApi);
            // bind the other mocks here
        }
    }

    @Test
    public void checkEmptyFormDoNotPerformLogin() throws Exception {
        onView(withId(R.id.etLogin)).perform(clearText());
        onView(withId(R.id.etPassword)).perform(clearText());
        onView(withId(R.id.btLogin)).perform(click());
        verify(mApi, times(0)).login("", "");
    }

    // ...
}

当然,您可以提取 class 并将模块传递给构造函数以获得更清晰的代码。

根据 https://github.com/roboguice/roboguice/wiki/Your-First-Testcase,您应该调用 RoboGuice.util.reset() 来拆除自定义注入器。你可以把它

        @Override
        protected void afterActivityFinished() {
            RoboGuice.util.reset();
        }