Generics Kotlin:手动内联泛型函数会产生不同的结果吗?

Generics Kotlin:手动内联泛型函数会产生不同的结果吗?,generics,mockito,kotlin,Generics,Mockito,Kotlin,我有一个简单的测试类 class SimpleClassTest { private fun <T> anyObject(): T { return Mockito.anyObject<T>() } lateinit var simpleObject: SimpleClass @Mock lateinit var injectedObject: InjectedClass @Before fun se

我有一个简单的测试类

class SimpleClassTest {

    private fun <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())
    }
}

verify(injectedObject).设置DependentObject(Mockito.anyObject())
但是,现在错误为
java.lang.IllegalStateException:Mockito.anyObject()不能为null

将函数调用内联到直接语句中有什么错误吗

使用和使用有什么不同吗

private fun <T> anyObject(): T {
    return Mockito.anyObject<T>()
}
private fun anyObject():T{
返回Mockito.anyObject()
}
下面呢

Mockito.anyObject<DependentClass>()
Mockito.anyObject()

Mockito.anyObject()的源代码

此方法为Mockito设置一些内部状态,然后继续返回
null
。由于在
settingDependentObject()
方法中需要非空实例,因此运行时失败



然而,我不确定你的第一种方法为什么成功。将
null
强制转换为
T
,但这对我不再有效。因此,我也无法让您的第一个实现成功。

Mockito.anyObject()的源代码:

此方法为Mockito设置一些内部状态,然后继续返回
null
。由于在
settingDependentObject()
方法中需要非空实例,因此运行时失败



然而,我不确定你的第一种方法为什么成功。将
null
强制转换为
T
,但这对我不再有效。就这一点而言,我也无法让您的第一次实现成功。

为了克服这个问题,我写了一点。您好@nhaarman,很高兴收到您的来信。实际上,我知道由于Kotlin空安全要求和Mockito返回空值而导致的空错误问题,并且想知道该函数是如何让它为我工作的。因此,我把我的问题原封不动地贴上去。我确实尝试过使用helper库,但是在使用OkHttp响应时出现了一个问题。我把问题发到,这是专门为你准备的。(我认为其他人无法回答,因为这可能是您的图书馆特有的)。Thanks@nhaarman第一种方法之所以有效,是因为编译器在调用
SimpleClassTest.anyObject
函数后不会插入空检查。稍后可能会更改此行为,请参阅@llya,感谢您指出这一点。也许你可以把这个评论作为答案,解释为什么一个编译而另一个不编译,我可以给它打勾。当我计划勾选涵盖这两种情况的答案时。为了克服这个问题,我写了一点。嗨@nhaarman,很高兴收到你们的来信。实际上,我知道由于Kotlin空安全要求和Mockito返回空值而导致的空错误问题,并且想知道该函数是如何让它为我工作的。因此,我把我的问题原封不动地贴上去。我确实尝试过使用helper库,但是在使用OkHttp响应时出现了一个问题。我把问题发到,这是专门为你准备的。(我认为其他人无法回答,因为这可能是您的图书馆特有的)。Thanks@nhaarman第一种方法之所以有效,是因为编译器在调用
SimpleClassTest.anyObject
函数后不会插入空检查。稍后可能会更改此行为,请参阅@llya,感谢您指出这一点。也许你可以把这个评论作为答案,解释为什么一个编译而另一个不编译,我可以给它打勾。正如我计划勾选的那个样,答案涵盖了这两种情况。你们使用的是什么版本的Kotlin及其插件?我使用的是1.0.1-2。当我切换到1.0.2时,它仍然可以工作。你使用的是什么版本的Kotlin及其插件?我使用的是1.0.1-2。当我切换到1.0.2时,它仍然有效。
private fun <T> anyObject(): T {
    return Mockito.anyObject<T>()
}
Mockito.anyObject<DependentClass>()
/**
 * Matches anything, including null.
 * <p>
 * This is an alias of: {@link #any()} and {@link #any(java.lang.Class)}
 * <p>
 * See examples in javadoc for {@link Matchers} class
 * 
 * @return <code>null</code>.
 */
public static <T> T anyObject() {
    return (T) reportMatcher(Any.ANY).returnNull();
}