Mockito.do没有什么不适用于处理程序

布鲁诺·迭戈·马丁斯

运行单元测试时出现以下错误:

java.lang.RuntimeException:android.os.Handler中的方法removeCallbacks没有被模拟。有关详情,请参见http://g.co/androidstudio/not-mocked

在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
}
卢西亚诺·费鲁齐(Luciano Ferruzzi)

被测试的类没有使用模拟的处理程序实例。被测试的类正在创建自己的处理程序,该处理程序是Android依赖项,考虑到您应该使用Robolectric测试运行程序或在构造函数中接收Handler来正确模拟实例。我的建议是使用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'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章