模拟静态方法 - Kotlin

问题描述 投票:0回答:1

我一直在使用 Mockito、Mockk 和 PowerMock 来模拟静态方法,但没有效果。 我不确定我的理解是否正确,但我期望当我模拟(静态或实例)方法时,实际的方法实现被绕过并返回提供的值。

这似乎对于实例方法非常有效,但由于某种原因我无法让它与静态方法一起工作。看来它实际上进入了模拟方法的实现(这迫使我进入模拟整个调用链的兔子洞)。

我想模拟一个

isOnline(context: Context)
方法,该方法通过调用一系列 Android 调用来检查连接性来返回布尔值。我想根据测试场景对该方法进行存根以返回 true 或 false,但是在向其传递模拟上下文时,我收到有关将 null 转换为 ConneectivityManager 的错误(包括下面的实现片段)。

示例(使用Mockk): 嘲讽:

context = Mockito.mock(Context::class.java)
mockkStatic(NetworkManager::class)
every { NetworkManager.isOnline(context) } answers { true}

测试:

assertThat(NetworkManager.isOnline(context)).isTrue()

网络管理器片段:

fun isOnline(context: Context): Boolean {
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager` <-- here's where the test fails, says that cannot cast null to 

使用 Mockito 时也会发生同样的情况:

mockStatic(NetworkManager::class.java)
    .use { mocked ->
        mocked.`when`<Boolean> { NetworkManager.isOnline(context) }.thenReturn(true)
        assertThat(NetworkManager.isOnline(context)).isTrue()
}

PowerMock/EasyMock:

context = mock(Context::class.java);
createMock(NetworkManager::class.java);
expect(NetworkManager.isOnline(context)).andReturn(true);
assertThat(NetworkManager.isOnline(context)).isTrue();

有什么办法可以解决吗?我看到有关模拟静态方法的文档,但我还没有设法使其工作。

谢谢!

android kotlin mocking mockito mockk
1个回答
0
投票

尝试模拟对象:

mockkObject(NetworkClassManager.Companion)

根据这个答案:https://github.com/mockk/mockk/issues/136#issuecomment-419879755

© www.soinside.com 2019 - 2024. All rights reserved.