通过下面的测试课程 .
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>
与Kotlin的 <reified T: Any>
的不同之处是什么?
UPDATED 答案是Any为非null,然后使用 <reified T: Any>
不应返回错误,因为 settingDependentObject(...)
被声明为接收非null参数 . 我希望 <reified T>
应该出错,但它与我的理解相反 .
我明白了什么问题吗?
2 回答
当您在类型参数上添加
T : Any
约束时,您实际上将其设置为非空:T
是Any
的子类型,Any
不能保留空值 .由于函数是内联函数并且具有reified类型参数,因此该参数将替换为真正的非可空类型 . 因此,在呼叫站点上执行空检查,因此您将获得此异常 .
如stated in the documentation和the linked answer,默认上限为
Any?
. 换句话说,以下声明是等效的:Mockito.anyObject<T>()
will return null适用于T:Any
和T:Any?
. 当调用返回类型T:Any
的方法时,Mockito返回的null
值无法通过Kotlin编译器插入的运行时检查 . 在调用settingDependentObject
之前,会抛出您获得的错误 .