Kotlin mock无法模拟在其类之外定义的函数

Kotlin mock无法模拟在其类之外定义的函数,kotlin,mockk,Kotlin,Mockk,在我看来,mock无法模拟函数,这些函数是在包级别(而不是它们所属的类)定义的。下面是一个小例子: package some.package class A {} class B {} fun A.getB() : B { println("real getB called!") return B() } 和一个类来测试它: class Test { @MockK private lateinit var a : A @BeforeMethod

在我看来,mock无法模拟函数,这些函数是在包级别(而不是它们所属的类)定义的。下面是一个小例子:

package some.package

class A {}
class B {}

fun A.getB() : B {
  println("real getB called!")
  return B()
}
和一个类来测试它:

class Test {

  @MockK
  private lateinit var a : A

  @BeforeMethod
  fun setUp() {
    init(this)
    val bMock = mockk<B>()
    every { a.getB() } returns bMock
  }

  @Test
  fun test() {
    a.getB()
  }
}
类测试{
@莫克
私有lateinit变量a:a
@预处理法
趣味设置(){
初始化(本)
val bMock=mockk()
每个{a.getB()}返回bMock
}
@试验
趣味测试(){
a、 getB()
}
}

此测试失败,在每个{…}块中出现类似于
缺少调用的消息
。但是如果我将函数
getB()
移动到类
A
,那么测试成功。我找不到关于这种行为的任何文件。有什么解决办法吗?不幸的是,在我的实际项目中,我没有可能将函数移动到类中。有没有其他方法可以解决这个问题?

您需要引用正在模拟的扩展函数
mockkStatic
。这是用于类之外的扩展函数


是的,谢谢!但不是将::getB作为参数,而是将包和文件名作为字符串,因此在我的例子中(假设file.kt是文件名):mockkStatic(“some.package.FileKt”)是的,这是引用文件中多个扩展函数的另一种方法。