通过下面的测试课程.
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
调用之前抛出的错误.
归档时间: |
|
查看次数: |
652 次 |
最近记录: |