【发布时间】:2016-05-23 00:22:27
【问题描述】:
下面的测试类,通过。
class SimpleClassTest {
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
lateinit var simpleObject: SimpleClass
@Mock lateinit var injectedObject: InjectedClass
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
}
@Test
fun testSimpleFunction() {
simpleObject = SimpleClass(injectedObject)
simpleObject.simpleFunction()
verify(injectedObject).settingDependentObject(anyObject())
}
}
但是如果我们改变
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
到
private inline fun <reified T: Any> anyObject(): T {
return Mockito.anyObject<T>()
}
它会失败
java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null
<reified T> 和 <reified T: Any> 在 Kotlin 中有什么不同?
更新
答案是 Any 是非空的,那么使用 <reified T: Any> 不应该返回错误,因为 settingDependentObject(...) 被声明接收非空参数。我希望<reified T> 应该出错,但这与我的理解相反。
我理解错了吗?
【问题讨论】:
-
Mockito.anyObject
是一个 java 方法并返回 Platform-Type "Any!"该类型可以是可空的或不可空的。 kotlin 编译器不会在那里推断出任何东西(因为对每个平台类型进行空值检查都很嘈杂)。所以如果你分配“任何!”对于“任何”,这可能会在运行时失败。见:kotlinlang.org/docs/reference/…