首页 > 解决方案 > 如何将依赖项注入 Kotlin 中的接口委托?

问题描述

我试图弄清楚如何将依赖项注入 Kotlin 中的接口委托。我有一堂课:

class MyThingie {}

而且我想向created_time此类添加一个字段,该字段也可能添加到其他类中。所以我可以创建一个接口和这个接口的实例实现,然后将该委托添加到类定义中:

interface ThingieWithCreatedTS {
    val created_ts: Long
}

object ThingieCreatedAtNow : ThingieWithCreatedTS {
    override val created_ts: Long = System.currentTimeMillis()
}

class MyThingie : ThingieWithCreatedTS by ThingieCreatedAtNow {}

这很棒。现在我可以调用created_ts任何实例MyThingie并获取它创建的时间戳。然而,这现在很难测试。

我真的不想尝试模拟System,我理解正确的模式是将某种 Clock 实例注入任何需要知道当前时间的东西。这样,我可以在代码中提供一个 RealClock,在测试中我可以提供一个 FakeClock(我可以控制输出)。

目前尚不清楚我如何在这种模式下做到这一点。如何将实现实例传递给委托?

标签: kotlindependency-injectiondelegatescomposition

解决方案


为什么不直接使用构造函数依赖注入?

class MyThingie(
    dep: ThingieWithCreatedTS = ThingieCreatedAtNow
) : ThingieWithCreatedTS by dep {}

现在您可以在测试中提供假ThingieWithCreatedTS依赖


推荐阅读