作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在运行单元测试时遇到以下错误:
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/
我是一名优秀的程序员,十分优秀!