【问题标题】:Kotlin: Manually inlining a generic function produce a different result?Kotlin:手动内联泛型函数会产生不同的结果?
【发布时间】:2016-05-22 13:44:07
【问题描述】:

我有一个简单的测试类

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

它工作正常并通过。

由于私有通用 anyObject() 函数只使用一次,所以我决定(手动)内联它,即删除该函数的需要,因此我改变了

verify(injectedObject).settingDependentObject(anyObject())

verify(injectedObject).settingDependentObject(Mockito.anyObject<DependentClass>())

但是现在这个错误为 java.lang.IllegalStateException: Mockito.anyObject&lt;DependentClass&gt;() must not be null

将函数调用内联到直接语句中我做错了什么?

使用有什么不同

private fun <T> anyObject(): T {
    return Mockito.anyObject<T>()
}

还有以下?

Mockito.anyObject<DependentClass>()

【问题讨论】:

  • 您使用的是什么版本的 Kotlin 及其插件?
  • 我使用 1.0.1-2。当我切换到 1.0.2 时,它仍然有效。

标签: generics mockito kotlin


【解决方案1】:

Mockito.anyObject()的来源:

/**
 * 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();
}

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


但是,我不确定为什么您的第一个方法成功了。将null 转换为T seemed to work a while ago,但它不再适合我了。就此而言,我也无法让您的第一个实施成功。

【讨论】:

  • 为了克服这个问题,我写了一点helper library
  • 嗨@nhaarman,很高兴收到你的来信。实际上,由于 Kotlin 空值安全要求和 Mockito 返回空值,我知道空值错误问题,并且想知道该函数如何使它为我工作。因此,我按原样发布我的问题。我确实尝试使用帮助程序库,但使用 OkHttp 响应时出现问题。我将问题发布在stackoverflow.com/questions/37380830/…,这是专门为您准备的。 (我认为其他人将无法回答,因为它可能是您的图书馆特定的)。谢谢
  • @nhaarman 第一种方法有效,因为编译器在调用SimpleClassTest.anyObject 函数后没有插入空检查。以后可能会更改此行为,请参阅KT-8135
  • @llya,感谢您指出这一点。也许您可以将评论作为答案,解释为什么一个编译而另一个不编译,我可以打勾。因为我打算勾选涵盖这两种情况的答案。
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多