«Невозможно смешивать тестовые корни с нетестовыми корнями»

#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 для всех инструментальных тестов в вашем проекте. Выполните следующие действия:

  1. Создайте пользовательский класс, который расширяет AndroidJUnitRunner в папке androidTest.
  2. Переопределите функцию 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. Спасибо, но это именно то, что я уже написал в своем вопросе? У меня настроен этот тестовый бегун, и я подтвердил, что он запущен.