通过下面的测试课程.
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())
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我们改变了
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
Run Code Online (Sandbox Code Playgroud)
至
private inline fun <reified T: Any> anyObject(): T {
return Mockito.anyObject<T>()
}
Run Code Online (Sandbox Code Playgroud)
它将失败
java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null
Run Code Online (Sandbox Code Playgroud)
<reified T>与<reified T: Any>Kotlin有什么不同?
更新
答案Any是非null,然后使用<reified T: Any>不应该返回错误,因为settingDependentObject(...)声明接收非null参数.我希望<reified T>应该出错,但它与我的理解相反.
我明白了什么问题吗?
如文档和链接答案中所述,默认上限为Any?.换句话说,以下声明是等效的:
inline fun <reified T> anyObject(): T = Mockito.anyObject<T>()
inline fun <reified T:Any?> anyObject(): T = Mockito.anyObject<T>()
Run Code Online (Sandbox Code Playgroud)
该Mockito.anyObject<T>() 会返回null两个T:Any和T:Any?.当T:Any调用具有返回类型的方法时null,Mockito返回的值无法通过Kotlin编译器插入的运行时检查.settingDependentObject调用之前抛出的错误.