gpt4 book ai didi

android - Mockito.doNothing 不适用于 Handler

转载 作者:行者123 更新时间:2023-11-29 22:53:59 24 4
gpt4 key购买 nike

我在运行单元测试时遇到以下错误:

java.lang.RuntimeException: Method removeCallbacks in android.os.Handler not mocked. See http://g.co/androidstudio/not-mocked for details.

at android.os.Handler.removeCallbacks(Handler.java)

Mockito.doNothing() 不应该阻止方法 removeCallbacks 运行吗?

测试类:

    @Mock
private lateinit var handler: Handler

private lateinit var myClass: MyClass

init {
initMocks(this)
}

@Before
fun setUp() {
myClass = MyClass()
doNothing().`when`(handler).removeCallbacks(ArgumentMatchers.any(Runnable::class.java))
}

@Test
fun `When do something then `() {
assertThat(doSomething()).isTrue()
}

真正的方法:

fun doSomething(): Boolean {
handler.removeCallbacks(runnable)
...
return result
}

最佳答案

模拟的处理程序实例未被测试类使用。被测试的类正在创建自己的处理程序,这是一个 Android 依赖项,考虑到这一点,您应该使用 Robolectric 测试运行器或在构造函数中接收处理程序以正确模拟实例。我的建议是使用 Robolectric。

作为参数接收:

    @Mock
private lateinit var handler: Handler

private lateinit var myClass: MyClass

init {
initMocks(this)
}

@Before
fun setUp() {
doNothing().`when`(handler)
.removeCallbacks(ArgumentMatchers.any(Runnable::class.java))
myClass = MyClass(handler)
}

使用Robolectric,在这种情况下,你不需要关心Handler:

 @RunWith(AndroidJUnit4::class)
@Config(manifest = Config.NONE)
class MyClassTest {
private lateinit var myClass: MyClass

init {
initMocks(this)
}

@Before
fun setUp() {
myClass = MyClass()
}
}

您还必须将依赖项添加到您的 build.gradle 中才能使用 Robolectric:

testImplementation 'org.robolectric:robolectric:4.2.1'
testImplementation 'androidx.test.ext:junit:1.1.1'

关于android - Mockito.doNothing 不适用于 Handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com