Шпионская активность с Mockito в тестах Espresso с приложением, использующим инъекцию зависимостей Dagger2 - PullRequest
0 голосов
/ 11 декабря 2018

Я очень новичок в использовании приложения Dagger 2 в Android.В настоящее время у нас есть приложение, в котором некоторые его части вводятся как зависимости.Тем не менее, я не могу шпионить HomeActivity в наших тестах Espresso, используя этот фрагмент кода:

@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, однако это ничего не изменило.У кого-нибудь есть предложения, что следует изменить, чтобы шпионить HomeActivity?

1 Ответ

0 голосов
/ 12 мая 2019

Проблема слежки за активностью заключается в том, что вы можете предоставить AndroidInjector.Factory только для суперкласса, который в данном случае является HomeActivity, но Mockito создает подкласс HomeActivity $ MockitoMock $ ... во время выполнения.

Из того, что я нашел до сих пор - невозможно создать AndroidInjector.Factory для подклассов.

Можно издеваться над AndroidInjector.Factory, но это считается плохой практикой самими разработчиками Dagger.

UPD : я закончил тем, что использовал Robolectric для тестирования жизненного цикла действий \ сервисов, проверьте, соответствует ли он и вашим потребностям.

...