3

我第一次使用 Android Studio 3.2 实现 AndroidInstrumentationTest,尝试检查方法是否根据字符串从属性(R.attr 和样式中设置的颜色)返回颜色资源 ID,但返回的资源 ID 始终为 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)
4

1 回答 1

3

属性是有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)
}
于 2019-05-22T16:35:28.117 回答