我一直在使用 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();
有什么办法可以解决吗?我看到有关模拟静态方法的文档,但我还没有设法使其工作。
谢谢!
尝试模拟对象:
mockkObject(NetworkClassManager.Companion)
根据这个答案:https://github.com/mockk/mockk/issues/136#issuecomment-419879755