使用mockkStatic对带有泛型参数的扩展方法进行模拟:"无法推断类型变量T的足够信息"。

4

提醒:我目前使用的是Mockk-1.12.4和Kotlin-1.6

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

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

这被定义为一个在Extentions.kt文件中的顶层函数(不是一个类)。我希望使用mockkStatic用MockK来模拟它。
mockkStatic(Entity::selectReferenceAsOptionalSingleObject)

然而,我遇到了错误:
Not enough information to infer type variable T

因为它无法确定我应该模拟哪种类型。我已经尝试在许多地方添加我的类型参数。

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)

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


1
不是最好的解决方案,但我刚刚意外地找到了一个变通方法。如果您将函数引用存储在变量中,它似乎可以工作(尽管我现在遇到了VerifyError),如下所示:val function: KFunction<MyType> = Entity::selectReferenceAsSingleObjectmockkStatic(function) - Bradley Gray
2个回答

2

试试这个:

mockkStatic("your.package.YourFileExtensionKt")

你也可以给文件起一个好听的名字:
@file:JvmName("Extension")

看起来应该像这样:

mockkStatic("your.package.Extension")

无论如何,为了让测试正常运行,您必须在扩展类中使用模拟对象,例如实体(Entity),代码如下:

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

0

需要注意以下事项:

如果你的Kotlin文件是your.package.YourFileExtension.kt,那么mockkStatic应该像这样:

mockkStatic("your.package.YourFileExtensionKt")

Kt是由Kotlin编译器自动添加的后缀


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接