Espresso中Mockito的Spying Activity使用Dagger2依赖项注入对应用程序进行测试



我对在Android应用程序中使用Dagger 2非常熟悉。目前,我们有一个应用程序,其中的某些部分作为依赖项注入。然而,我无法使用以下代码在我们的Espresso测试中监视HomeActivity:

@LargeTest
@RunWith(AndroidJUnit4.class)
Public class ConnectionRobotTests {
private HomeRobot homeRobot = new HomeRobot();
private NetworkResults networkResults = new NetworkResults();
HomeActivity object;
SingleActivityFactory<HomeActivity> activityFactory =
new SingleActivityFactory<HomeActivity>(HomeActivity.class) {
@Override
protected HomeActivity create(Intent intent) {
object = spy(getActivityClassToIntercept());
return object;
}
};
@Rule public ActivityTestRule<HomeActivity> testRule =
new ActivityTestRule<>(activityFactory, true, true);
@AfterClass
public static void afterTest() {
User.logout();
Storage.clearAllPreferences();
}
@Test
public void connectAndDisconnectViaQuickConnect() {
MockConnectionHelper.mockConnection(testRule);
networkResults.isServerAvailable();
homeRobot.connect().isConnectedTo();
ConnectionResult result = homeRobot.disconnect();
result.isDisconnected();
}

这是TestAppComponent.class:

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class,  
ActivityBuilder.class, MockAppModule.class})
public interface TestAppComponent extends AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(TestApplication application);
TestAppComponent build();
}
}

MockAppModule.class:

@Module
public class MockAppModule {
@Singleton
@Provides
Gson provideGson() {
return new Gson();
}
}

TestApplication.class:

public class TestApplication extends MyApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerTestAppComponent.builder().application(this).build();
}
}

当我运行测试时,我得到一个错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.application.android/com.application.android.ui.home.HomeActivity}: java.lang.IllegalArgumentException: No injector factory bound for Class<com.application.android.ui.home.HomeActivity$MockitoMock$1418108435>. Injector factories were bound for supertypes of com.application.android.ui.home.HomeActivity$MockitoMock$1418108435: [com.application.android.ui.home.HomeActivity]. Did you mean to bind an injector factory for the subtype?
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<com.application.android.ui.home.HomeActivity$MockitoMock$1418108435>. Injector factories were bound for supertypes of com.application.android.ui.home.HomeActivity$MockitoMock$1418108435: [com.application.android.ui.home.HomeActivity]. Did you mean to bind an injector factory for the subtype?
at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:104)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:59)
at com.application.android.ui.home.HomeActivity.onCreate(HomeActivity.java:96)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:667)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)

这是我缺少的补充吗?还是我应该以不同的方式处理HomeActivity的间谍活动?我试图为HomeActivity添加Injector工厂,但它没有改变任何内容。有人有什么建议应该改为间谍家庭活动吗?

监视活动的问题是您只能提供AndroidInjector。超级类的工厂,在这种情况下是HomeActivity,但Mockito创建了一个子类HomeActivity$MockitoMock$。。。在运行时。

根据我目前的发现,没有可能创建AndroidInjector。子类的工厂。

可以模拟AndroidInjector。但Dagger开发人员自己认为这是一种糟糕的做法。

UPD:我最终使用Robolectric来测试活动\服务的生命周期,检查它是否也适合您的需求。

最新更新