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
您的被测系统创建一个新的处理程序:
new Handler(Looper.getMainLooper()).postDelayed(...
但是您的单元测试代码仅将
every
用于特定的模拟处理程序:
val Handler = mockk<Handler>(relaxed = true)
every {
Handler.postDelayed(capture(slotrunnable) ,100)
所以这仅适用于该特定的模拟对象。您可能因使用大写首字母(与类的名称相同)来命名对象而被误导。不要那样做。如果您将其命名为
handler
而不是 Handler
,那么您会注意到您的 every
只会影响该方法,而不影响整个类。
您应该将 Handler 对象传递给您的方法(依赖注入),而不是在方法内部创建它。然后你的单元测试可以将模拟对象传递给你的被测方法。