在Android中模拟私有对象

时间:2019-05-08 17:48:15

标签: android unit-testing mockk

是否可以使用模拟库进行模拟。

我有一堂课(删除了某些部分,试图简化问题)

class SettingsManager(val application: Application) {

    private val fetcher: Fetcher = Fetcher(application)

    suspend fun fetchRemote() {
        fetcher.doFetch()
    }
}

class Fetcher(val application: Application) {
    fun doFetch() {
        if (canFetch()) {
            // make GET request
        }
    }

    fun canFetch() {
        if (application.isOnline()) {
            return true
        }
        return false
    }
}

Extension


@RequiresPermission(value = Manifest.permission.ACCESS_NETWORK_STATE)
fun Context.isOnline(): Boolean {
    val connectivityManager = this
            .getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
    connectivityManager?.apply {
        val netInfo = activeNetworkInfo
        netInfo?.let {
            if (it.isConnected) return true
        }
    }
    return false
}

我试图从根本上模拟私有类Fetcher所做的工作。我以为我可以做到:

val mockFetcher = mockk<Fetcher>()
every { mockFetcher.canFetch() } returns true

但是,这不会嘲笑私有实例。有没有办法模拟私有实例?我知道,如果我为私有Fetcher创建了一个接口,而是将其公开并注入了类型,则可以对其进行模拟。但是,Settings Manager的外部使用者不需要知道提取逻辑。我不确定用嘲笑是否可以嘲笑私有对象。

0 个答案:

没有答案