Инструментальный тест для инъекций рукоятки в Android

Я создаю демонстрационное приложение с помощью Jitpack Compose и решил использовать Hilt для DI. Все работает нормально, когда я запускаю приложение, я получаю свои внедренные зависимости без проблем, и приложение просто работает успешно, однако, когда я пытаюсь запустить тест Instrumentation, я продолжаю получать следующую ошибку;

Execution failed for task ':app:kaptDebugAndroidTestKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message) 

Никакой дополнительной информации, которая помогла бы мне выяснить причину этого. Я удалил большую часть кода, связанного с DI, чтобы помочь мне сузить проблему, так что теперь это выглядит так;

MyApp.kt

@HiltAndroidApp
class MyApp : Application()

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var newsRepository: LocalRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TodayNewsApp(newsRepository)
        }
    }
}

LocalRepository.kt

class LocalRepository @Inject constructor() : NewsRepository {

    override fun getNews(callback: (Result<List<Article>>) -> Unit) {
        callback(Result.Success(articles))
    }
}

статьи - это просто список фиктивных сообщений.

NewsRepository.kt

interface NewsRepository {

    fun getNews(callback: (Result<List<Article>>) -> Unit)
}

По поводу тестовых классов; Я создал кастомного раннера

MyCustomTestRunner.kt

class MyCustomTestRunner : AndroidJUnitRunner() {
    override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {
        return super.newApplication(cl, HiltTestApplication::class.java.name, context)
    }
}

и использовал его в app / build.gradle в defaultConfig

testInstrumentationRunner "app.abedelazizshe.todaynews.MyCustomTestRunner"

Например, для классов тестирования это не работает независимо от того, что делает тест;

TodayNewsUITest.kt

@HiltAndroidTest
class TodayNewsUITest {

    @get:Rule(order = 0)
    var hiltRule = HiltAndroidRule(this)

    @get:Rule(order = 1)
    val composeTestRule = createComposeRule()

    @Inject
    lateinit var newsRepository: LocalRepository

    @Before
    fun setup() {
        hiltRule.inject()
        composeTestRule.launchApp(newsRepository)
    }

    @Test
    fun app_launches() {
       findByText("TodayNews").assertIsDisplayed()
    }
}

и я использую

   androidTestImplementation "com.google.dagger:hilt-android-testing:2.28-alpha"
   kaptAndroidTest "com.google.dagger:hilt-android-compiler:2.28-alpha"

В тот момент, когда я удаляю следующую строку из MainActivity.kt, тесты запускаются успешно.

    @Inject lateinit var newsRepository: LocalRepository

Я использую Android Studio Preview 4.2.

Я был бы признателен за вашу помощь


person Abed Elaziz Shehadeh    schedule 23.06.2020    source источник
comment
Вы нашли решение?   -  person A1m    schedule 28.08.2020
comment
Не совсем, в jetpack compose прошла серия больших обновлений, затронувших большинство API. Поэтому я перестал работать над проектом, пока не будет выпущена стабильная версия. Поскольку сейчас он находится в альфа-версии, я попробую еще раз и опубликую решение, если мне удастся его исправить.   -  person Abed Elaziz Shehadeh    schedule 30.08.2020


Ответы (1)


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

./gradlew testdebug -stacktrace

и убедитесь, что в app build.gradle source и targetCompatibilty установлено значение Java.Version

 compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
}
8

 compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
}
person Jitendra Prajapati    schedule 28.07.2020
comment
Спасибо, я попробовал это и продолжал получать одну и ту же проблему независимо от того, где выполнялись тесты. Я попробую еще раз, так как compose достиг альфа-версии, и буду здесь комментировать снова. - person Abed Elaziz Shehadeh; 30.08.2020