如何在 kotlin 中模拟处理程序

问题描述 投票:0回答:1
   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 ");

}

我正在尝试使用 slot 函数返回 run() 函数来在 kotlin 上模拟上述处理程序代码

这是我的改变

    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属性尚未初始化slot

java kotlin unit-testing mockito handler
1个回答
0
投票

您的被测系统创建一个新的处理程序:

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

但是您的单元测试代码仅将

every
用于特定的模拟处理程序:

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

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

所以这仅适用于该特定的模拟对象。您可能因使用大写首字母(与类的名称相同)来命名对象而被误导。不要那样做。如果您将其命名为

handler
而不是
Handler
,那么您会注意到您的
every
只会影响该方法,而不影响整个类。

您应该将 Handler 对象传递给您的方法(依赖注入),而不是在方法内部创建它。然后你的单元测试可以将模拟对象传递给你的被测方法。

© www.soinside.com 2019 - 2024. All rights reserved.