更换Espresso的注射模块

时间:2015-03-03 10:02:17

标签: android roboguice android-espresso

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

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

如何更改我的测试套件以使用Roboguice保留espresso的自定义注射模块。

PS:我已经看过Roboelectric如何做到这一点,但我现在还没有使用Roboelectric。

2 个答案:

答案 0 :(得分:2)

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

在启动活动之前,您需要声明一个自定义的ActivityTestRule类来覆盖Application Injector。这是一个例子:

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

    // ...
}

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

答案 1 :(得分:0)

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

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