在 mockk 中模拟嵌套属性

问题描述

我有一个函数,它使用 DisplayMetrics 类的 ResourcesContext 中的一个字段:

fun getIconForDevice(context: Context,iconUrl: String): String {
    val metrics = context.resources.displayMetrics
    var suffix = ""
    //below checks MUST be in this increasing order or it may failed
    if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM)
        suffix = "-m"
    else if (metrics.densityDpi <= DisplayMetrics.DENSITY_HIGH)
        suffix = "-h"
    else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XHIGH)
        suffix = "-xh"
    else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXHIGH || metrics.densityDpi > DisplayMetrics.DENSITY_XXHIGH)
        suffix = "-xxh"
    val pasvand = iconUrl.substring(iconUrl.lastIndexOf("."))
    val str = iconUrl.substring(0,iconUrl.lastIndexOf(".")) + suffix + pasvand
    return str
}

为了测试它,我需要模拟 Contextmetrics.densityDpi 给它一个值。
我正在使用 Mockk (1.9.3) 库来做到这一点。

@Test
fun getIconForDevice_ReturnsUrlWithXxhForXxhDisplay() {
    val context: Context = mockk(relaxed = true)
    every { context.resources.displayMetrics.densityDpi } returns 450
    assertEquals(IconHelper.getIconForDevice(context,"https://website.com/image.png"),"https://website.com/image-xxh.png")
}

在给出错误堆栈跟踪后运行测试:

java.lang.ClassCastException: java.lang.Integer cannot be cast to android.util.DisplayMetrics

    at ...Resources.getDisplayMetrics(Resources.java)
    at ....IconHelper.getIconForDevice(IconHelper.kt:39)
    at ...IconHelperTest.getIconForDevice_ReturnsUrlWithXxhForXxhDisplay(IconHelperTest.kt:30)

第一个链接指的是实际函数的val metrics = context.resources.displayMetrics

那么如何在 mockk 中模拟这样的嵌套字段?
context.resources.displayMetrics.densityDpi

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)