带有泛型参数的扩展方法的mockkStatic:“没有足够的信息来推断类型变量T”

Bra*_*ray 5 kotlin mockk

仅供参考:我目前正在使用 Mockk-1.12.4 和 Kotlin-1.6

我有一个返回类型 T 的对象的扩展方法:

fun <T> Entity.selectReferenceAsSingleObject(referenceName: String): T {
    return this.selectReferencesByName(referenceName).single().asObjet() as T
}
Run Code Online (Sandbox Code Playgroud)

它被定义为 Extentions.kt 文件中的顶级函数(因此不是一个类)。我想通过使用mockkStatic 用 MockK 来模拟这个

mockkStatic(Entity::selectReferenceAsOptionalSingleObject)
Run Code Online (Sandbox Code Playgroud)

但是我收到错误:

Not enough information to infer type variable T
Run Code Online (Sandbox Code Playgroud)

因为它无法确定我应该嘲笑什么类型。我尝试在很多地方添加类型参数

mockkStatic<KFunction<MyType>>(Entity::selectReferenceAsSingleObject)
mockkStatic<MyType>(Entity::selectReferenceAsSingleObject)
mockkStatic(Entity<KFunction<MyType>>::selectReferenceAsSingleObject)
mockkStatic(Entity<MyType>::selectReferenceAsSingleObject)
mockkStatic(Entity::<KFunction<MyType>>selectReferenceAsSingleObject)
mockkStatic(Entity::<MyType>selectReferenceAsSingleObject)
mockkStatic(Entity::selectReferenceAsSingleObject<KFunction<MyType>>)
mockkStatic(Entity::selectReferenceAsSingleObject<MyType>)
mockkStatic(Entity::selectReferenceAsSingleObject as KFunction<MyType>)
mockkStatic(Entity::selectReferenceAsSingleObject as MyType)
Run Code Online (Sandbox Code Playgroud)

但没有任何作用,它要么告诉我同样的错误,要么告诉我那里不允许类型参数。我不确定我需要做什么来修复我的语法,因为 IntelliJ 没有给我任何提示,所以我感觉有点卡住了。任何帮助,将不胜感激。

小智 2

尝试这个:

mockkStatic("your.package.YourFileExtensionKt")
Run Code Online (Sandbox Code Playgroud)

您还可以给该文件起一个好听的名称:

@file:JvmName("Extension")
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

mockkStatic("your.package.Extension")
Run Code Online (Sandbox Code Playgroud)

无论如何,要使测试正常工作,您必须在扩展类中使用模拟,在本例中为实体,它看起来像这样:

@Test
fun test() {
    val entity : Entity = mockk(relaxed = true)
    every { entity.selectReferenceAsSingleObject<Any>(any()) } returns "whatever"

    val result = entity.selectReferenceAsSingleObject<Any>("test")

    assertEquals("whatever", result)
}
Run Code Online (Sandbox Code Playgroud)