更改 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();
}
我有一个可以调用 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();
}