#android #dagger-hilt
#Android #рукоять кинжала
Вопрос:
Я пытаюсь запустить инструментальные тесты для приложения Android, но получаю эту ошибку во время компиляции:
Cannot mix test roots with non-test roots:
Non-Test Roots: com.my.application.MyApplication
Test Roots: [com.my.test.ActivityTest]
Приложение использует пользовательское приложение с комментариями @HiltAndroidApp
, поскольку в документах подразумевается, что это требуется для Hilt.
Мой тест следует этому шаблону:
@RunWith(AndroidJUnit4.class)
@HiltAndroidTest
class MyTest {
@Rule
public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
@Inject
SomeStuff stuff;
@Before
public void setUp() {
hiltRule.inject();
}
App runner создает обычное приложение Hilt:
public class MyAppRunner extends AndroidJUnitRunner {
@Override
public Application newApplication(ClassLoader cl, String className, Context context)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return super.newApplication(
cl, HiltTestApplication.class.getName(), context);
При запуске теста я получаю ошибку времени компиляции, описанную выше. Я полагаю, что ссылка на MyApplication
взята из файла приложения AndroidManifest.xml
.
Я пытался использовать @CustomTestApplication
with MyApplication
, но пользовательские тестовые приложения, по-видимому, не работают с приложениями, аннотированными with @HiltAndroidApp
.
Как правильно настроить тест с помощью приложения на базе Hilt?
Ответ №1:
Чтобы использовать тестовое приложение Hilt в инструментальных тестах, вам необходимо настроить новый тестовый запускатель. Это позволяет использовать Hilt для всех инструментальных тестов в вашем проекте. Выполните следующие действия:
- Создайте пользовательский класс, который расширяет AndroidJUnitRunner в папке androidTest.
- Переопределите функцию newApplication и передайте имя сгенерированного тестового приложения Hilt.
класс CustomTest: AndroidJUnitRunner() {
override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application { return super.newApplication(cl, HiltTestApplication::class.java.name, context) }
}
Затем настройте этот тестовый запуск в вашем файле Gradle, как описано в руководстве по инструментальному модульному тестированию. Убедитесь, что вы используете полный путь к классу:
android {
defaultConfig {
// Replace com.example.android.dagger with your class path.
testInstrumentationRunner "com.example.android.dagger.CustomTestRunner"
}
}
Источник : https://developer.android.com/training/dependency-injection/hilt-testing
Комментарии:
1. Спасибо, но это именно то, что я уже написал в своем вопросе? У меня настроен этот тестовый бегун, и я подтвердил, что он запущен.