mockito 如何在Kotlin中模拟处理程序

cmssoen2  于 11个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(137)
public void myTesting(){
    System.out.println("testing before ");
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            System.out.println("test");
        }
    }, 100);
    System.out.println("testing after ");

}

字符串
我尝试在Kotlin上模拟上面的处理程序代码,使用slot函数返回run()函数
这是我的零钱

mockkStatic(Looper::class)
    mockkStatic(Runnable::class)
    val looper = mockk<Looper>{
        every {
            thread
        } returns Thread.currentThread()
    }

    every {
        Looper.getMainLooper()
    } returns looper

    val Handler = mockk<Handler>(relaxed = true)

    every {
        Handler.postDelayed(capture(slotrunnable) ,100)
    } answers  {
        true
    }

    slotrunnable.captured.run()

    Manager.myTesting()


当我运行测试用例时,我正在获取lateinit属性捕获尚未初始化插槽

qnakjoqk

qnakjoqk1#

您的待测系统创建了一个新的数据库:

new Handler(Looper.getMainLooper()).postDelayed(...

字符串
但是您的单元测试代码只对特定的mock处理程序使用every

val Handler = mockk<Handler>(relaxed = true)

    every {
        Handler.postDelayed(capture(slotrunnable) ,100)


所以这只适用于特定的mock对象。你可能会被误导,因为你用大写的首字母命名你的对象,和类的名字一样。不要这样做。如果你把它命名为handler而不是Handler,你会注意到你的every只会影响那个方法,而不是整个类。
你应该将一个mock对象传递给你的方法(依赖注入),而不是在方法内部创建它。然后你的单元测试可以将mock对象传递给你的测试方法。

相关问题