gpt4 book ai didi

android - 更改 Espresso 的注入(inject)模块

转载 作者:行者123 更新时间:2023-11-29 00:13:02 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

// ...
}

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

关于android - 更改 Espresso 的注入(inject)模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com