【发布时间】:2021-12-09 04:08:52
【问题描述】:
我的类有一个带有默认参数的方法,其值来自注入的参数:
class Slack @Inject constructor(
private val brokerSettings: BrokerSettings
) {
fun alert(
message: String,
responsible: String = brokerSettings.slack?.responsible ?: "<!here>",
channels: List<String>? = brokerSettings.slack?.channels
) {
...
}
}
我可以构造一个mockk<Slack>,但是当我的测试尝试在其上调用alert(message) 时,依赖于默认参数,我在alert$default 中得到一个空指针异常。
如果我将上面的 brokerSettings.slack 更改为 brokerSettings?.slack,那么它可以工作 - 但警告我不需要额外的 ?。
我尝试模拟 brokerSettings 字段的吸气剂:
val slack = mockk<Slack>(relaxed = true)
{
// every { this@mockk.brokerSettings } answers { BrokerSettings() }
// every { this getProperty "brokerSettings" } propertyType BrokerSettings::class answers { BrokerSettings() }
}
但是如果字段是私有的,this@mockk.brokerSettings 将无法编译,并且如果它是公共的,则会像原始问题一样抛出 NPE,并且 this getProperty 会失败并出现反射错误。
我暂时将默认值设置为null 并使用?: 有条件地计算函数内部的默认值,但我不想这样做。
有什么想法吗?
【问题讨论】:
标签: kotlin nullpointerexception mocking mockk default-parameters