2

TLDR: Я разрабатываю приложение, которое выполняется в нескольких процессах. Для целей тестирования пользовательского интерфейса я хочу ввести поддельную зависимость API, чтобы приложение, работающее под тестированием, не зависело от сетевых взаимодействий, однако это не работает в настройке многопроцессорности.Зависимости от инъекций в многопроцессорных приложениях Android

Я использую подход, описанный в this post, так что я реализовал пользовательский AndroidJUnitRunner, который создает экземпляр приложения с притворными зависимостями (пусть это будет MockApplication) вместо одного с реальными зависимостями (пусть это будет RealApplication). Он работает, и мое приложение запрашивает поддельный интерфейс API из основного процесса.

Мое приложение, однако, использует несколько процессов, например. существует обработка данных Service, которая запускается в своем собственном процессе и которая начинается только с вызова startService из кода приложения. По какой-то причине этот процесс выполняется с экземпляром RealApplication без каких-либо макетных зависимостей.

Есть ли способ заставить это работать? Я пробовал копаться в коде Android, ответственном за создание приложения, но пока что не нашел ничего полезного.

P.S. Я использую Dagger 2 для DI, но это, вероятно, не очень актуально.

ответ

1

Проблема заключается в том, что ваш собственный класс приложений не переопределяет реальный в AndroidManifest.xml.

Вы просто говорите бегуну контрольно-измерительного прибора, чтобы запустить свой собственный класс приложений, но если приложение запустит другой процесс, Android Framework даже не узнает, что ему нужно запустить свой собственный класс приложений вместо реального.

Итак, я предлагаю вам переопределить класс приложения на пользовательский в AndroidManifest.xml во время выполнения задачи connectedAndroid, в результате ваше приложение будет использовать собственный класс даже без взлома тестового бегуна и при каждом запуске новых процессов.

0

Я тоже искал эту проблему, так как мне нужно было издеваться над сетевыми вызовами, исходящими от Service, запущенных в его собственном процессе.

Чтобы использовать пользовательский объект приложения (MockApplication) в каждом процессе вашего приложения во время тестов, необходимо ввести переменную build в AndroidManifest.xml с помощью manifestPlaceholders.

я определил два аромата продукта в build.gradle:

productFlavors { 
    mock { 
     manifestPlaceholders = [application:".MockApplication"] 
    } 
    prod { 
     manifestPlaceholders = [application:".RealApplication"] 
    } 

} 
  • прод: установит объект Real Application (RealApplication) в явном
  • макет: будет установить объект Application макет (MockApplication) в макете сети вызывает

в AndroidManifest.xml, используйте переменную «приложение», как это:

<application 
    android:label="@string/app_name" 
    android:name="${application}"> 

Теперь, когда вы хотите использовать MockApplication, просто запустите свой инструментальный тест с сборки вариант «mockDebug»