Метод тестирования Android, который возвращает идентификатор цветового ресурса из ссылки R.attr

Я впервые реализую AndroidInstrumentationTest с помощью Android Studio 3.2, пытаясь проверить, возвращает ли метод идентификатор ресурса цвета из атрибутов (R.attr и цвет, установленный в стилях) в зависимости от строки, но возвращаемый идентификатор ресурса всегда равен 0 вместо ожидаемого.

Код работает правильно в моем приложении, а цвет установлен следующим образом:

textView.setTextColor(fetchCorrectColor(myContext))

Проблема в том, что fetchColor из тестов возвращает 0

Другие ресурсы, поскольку mContext.getString() работают отлично

Тестовый класс снабжен аннотацией @RunWith(AndroidJunit4::class) и работает на эмулируемом Android Pie (28) и устройстве.

Я пробовал другой контекст с тем же результатом:

InstrumentationRegistry.getInstrumentation().targetContext
InstrumentationRegistry.getInstrumentation().context
ApplicationProvider.getApplicationContext()

Метод тестирования

fun getTextColor(status: String?, mContext: Context): Int{
    return when(status){
        "A", "B" ->{
            fetchCorrectColor(mContext)
        }
        "C", "D"->{
            fetchWarningColor(mContext)
        }
        else -> {
            fetchDisabledColor(mContext)
        }
    }
}

Методы получения цветового ресурса из атрибутов

fun fetchCorrectColor(context: Context): Int{
    return fetchColor(context, R.attr.correct)
}

private fun fetchColor(context: Context, colorId: Int): Int{
    val typedValue = TypedValue()
    context.theme.resolveAttribute(colorId, typedValue, true)
    return typedValue.data
}

Тестовое задание

@Test fun getTextColor_isCorrect(){
    Assert.assertEquals(R.attr.correct, getTextColor("A", mContext))
    Assert.assertEquals(R.attr.correct, getTextColor("B", mContext))
    Assert.assertEquals(R.attr.warning, getTextColor("C", mContext))
    Assert.assertEquals(R.attr.warning, getTextColor("D", mContext))
    Assert.assertEquals(R.attr.disabled, getTextColor(null, mContext))
}

Это ошибка, которую я получаю все время:

java.lang.AssertionError: expected:<2130968760> but was:<0>
at org.junit.Assert.fail(Assert.java:88)
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
3
0
885
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Атрибуты Theme осведомлены. Убедитесь, что context использует тот же theme, что и ваше приложение:

appContext.setTheme(R.style.AppTheme)

Пример тестового кода, разрешающего атрибут R.attr.colorPrimary, который доступен только в теме AppCompat:

@Test
fun testColorPrimary() {
    // Context of the app under test.
    val appContext = InstrumentationRegistry.getTargetContext()

    // actual R.color.colorPrimary value
    val actualPrimaryColor = appContext.getColor(R.color.colorPrimary)

    // R.attr.colorPrimary resolved with invalid theme
    val colorPrimary1 = TypedValue().also {
        appContext.theme.resolveAttribute(R.attr.colorPrimary, it, true)
    }.data

    // provided context has invalid theme so attribute resolution fails (returns 0)
    assertEquals(0, colorPrimary1)

    // be sure test context uses same theme as app
    appContext.setTheme(R.style.AppTheme)

    // R.attr.colorPrimary resolved from valid theme
    val colorPrimary2 = TypedValue().also {
        appContext.theme.resolveAttribute(R.attr.colorPrimary, it, true)
    }.data

    // valid theme returns proper color
    assertEquals(actualPrimaryColor, colorPrimary2)
}

Большое спасибо, Основная проблема заключалась в том, чтобы получить контекст с темой приложения (mContext.setTheme(R.style.AppTheme) сделал свое дело), ​​для теста я уже думал, что ожидаемое значение должно быть цветом из контекста, я мог проверить это после возврата fetchColor() != 0

París 22.05.2019 18:54

Другие вопросы по теме