我有一个应用程序可以调用REST API。 我正在使用Retrofit来实现API,我正在使用Roboguice在需要的地方注入我的REST服务。
我正在尝试使用浓缩咖啡来编写测试套件。我想使用自定义注入模块,因此我可以使用Mockito模拟Retrofit的响应。
如何更改我的测试套件以使用Roboguice保留espresso的自定义注射模块。
PS:我已经看过Roboelectric如何做到这一点,但我现在还没有使用Roboelectric。答案 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();
}