下面的测试类,通过。
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
在 Kotlin 中<reified T>
<reified T: Any>
有什么不同?
更新如果答案是 Any 是非空的,那么使用 <reified T: Any>
不应该返回错误,因为settingDependentObject(...)
被声明接收非空参数。我希望<reified T>
应该出错,但这与我的理解相反。
我理解错了吗?
如文档和链接答案中所述,默认上限为 Any?
。换句话说,以下声明是等效的:
inline fun <reified T> anyObject(): T = Mockito.anyObject<T>()
inline fun <reified T:Any?> anyObject(): T = Mockito.anyObject<T>()
Mockito.anyObject<T>()
将返回T:Any
和T:Any?
的null
。当调用返回类型为 T:Any
的方法时,Mockito 返回的 null
值无法通过 Kotlin 编译器插入的运行时检查。您收到的错误会在调用settingDependentObject
之前引发。
当您在类型参数上添加T : Any
约束时,您实际上是非 null:T
是 Any
的子类型,Any
不能保存 null。
由于该函数是内联的并且具有已确定的类型参数,因此该参数将替换为真正的不可为空的类型。因此,在呼叫站点上执行空检查,因此您会收到此异常。