【问题标题】:Mocking Interfaces with Kotlin and Mockito使用 Kotlin 和 Mockito 模拟接口
【发布时间】:2016-12-28 21:32:00
【问题描述】:

我不太了解 Kotlin 中的界面模拟。我不确定这是 Kotlin 特有的还是也适用于 java。到目前为止,我只在 Kotlin 中尝试过。

我有一个带接口的模拟类:

val mockObj = mock(MyClass::class.java, withSettings().extraInterfaces(IMyInterface::class.java)

现在,这会在 IntelliJ 中产生以下问题:

`when`(mockObj.someMethod()).thenReturn(0.1)

someMethod() 将是红色(我认为这取决于配色方案,但你明白了 - 一个问题:未解决的参考

为了解决这个问题,我只是在它之前添加了这一行:

val mockInterface = mockObj as IMyInterface

mockInterface 将带有灰色波浪线下划线,因为它从未使用过。我仍然使用mockObj 作为when

但是,这会使 红色 消失

我不确定为什么会这样……有人能解释一下这个理论吗?

为了去掉灰色下划线,我删除了val mockInterface =

所以我的魔法线减少到mockObj as IMyInterface

【问题讨论】:

  • 绝对清楚,我感到困惑的原因是因为我创建了一个我从未使用过的新变量 - 来解决问题......更令人困惑的是,我然后删除了作业的左手,它仍然有效!

标签: mockito kotlin


【解决方案1】:

mock(MyClass::class.java) 的返回类型是MyClass。返回的对象也是 IMyInterface 的一个实例,因为您向 Mockito 提出了这个要求,但 Kotlin 编译器无法知道这一点。

mockObj as IMyInterface 告诉 Kotlin 编译器将 mockObj 转换为 IMyInterface。由于 Kotlin 编译器支持smart casts,它知道,如果这一行没有抛出任何异常,那么mockObj 就是 IMyInterface 的一个实例。因此,它可以让您调用 someMethod(),并为您插入必要的演员表。

你可以用一个更简单的例子来复制这个:

val foo: Any = "hello"
val bar = foo as String
println(foo.length) // smart cast added here

您还可以使用is 运算符让编译器插入智能转换

val foo: Any = "hello"
if (foo is String) {
    println(foo.length) // smart cast added here
}

【讨论】:

  • 附注将其更改为 is 并将其分配给变量对我不起作用 - 但 as 已经足够了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 2019-04-17
相关资源
最近更新 更多