Ошибка вывода типа: недостаточно информации для вывода параметра T в шутке getApplicationContext (): T! Пожалуйста, укажите это явно - PullRequest
0 голосов
/ 03 апреля 2020

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

Type inference failed: Not enough information to infer parameter T in fun <T : Context!> getApplicationContext(): T! Please specify it explicitly.

, которая возникает в этой строке

val actualIntent: Intent = shadowOf(ApplicationProvider.getApplicationContext())
            .nextStartedActivity

Полный тестовый код выглядит следующим образом

@Test
fun clickingLogin_shouldStartLoginActivity() {
    val scenario = launch(LogInActivity::class.java)

    scenario.onActivity { activity ->
        activity.go_to_register_button.performClick()
        val expectedIntent = Intent(activity, RegistrationActivity::class.java)
        val actual: Intent = shadowOf(ApplicationProvider.getApplicationContext())
            .nextStartedActivity

        expectedIntent.component shouldBeEqualTo actual.component
    }
}

В основном функция shadowOf имеет вид перегружен и может вернуть много мыслей и мне нужно указать тип.

Я считаю, что это должно быть что-то вроде shadowOf<SomeType>(...) Но я понятия не имею, каким должен быть фактический тип.

Любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ Я следую указаниям roboloctri c , но пытаюсь написать это способом androidX

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Intent - это другой тип Object, который не простирается от Context.

этой строки:

val actualIntent: Intent = shadowOf(ApplicationProvider.getApplicationContext())

обеспечивает Context в качестве аргумента и возвращает ShadowContext, а не Intent.

Документы ref: http://robolectric.org/javadoc/3.0/org/robolectric/Shadows.html#shadowOf - android .content.Context-

В основном это говорит о том, что дерево не может быть типом машины.

0 голосов
/ 08 апреля 2020

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

Я не придумал, как проверить, дает ли активность правильные намерения в обычных тестах. Но в инструментальных тестах это выглядит так:

@get:Rule
var activityRule: IntentsTestRule<MyActivity> =
        IntentsTestRule(MyActivity::class.java)

@Test
fun testIntent () {

  // perform some actions
  // than verify
  intended(hasComponent(OtherActicity::class.qualifiedName))
  intended(hasExtra(A_CONSTANT, someValue))
}

Вам нужна зависимость, чтобы это работало

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'

подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...