【问题标题】:Mock extensions function inside Companion ObjectCompanion 对象内的模拟扩展功能
【发布时间】:2021-11-09 18:21:03
【问题描述】:

我有一个类(A 类),为了组织问题,我在另一个类(B 类)的伴随对象中定义了一个扩展函数(A.extension())。

在我的测试中我需要:

  • 使用真实的 A 类实例。
  • 模拟 A.extension()。
  • 使用 B 类的模拟实例。

使用 MockK-library 我无法成功模拟该扩展功能。 我试过了:

        mockkObject(B.Companion) {
            every { any<A>().extension() } returns whatIneed
        }

结果:尝试运行未模拟版本的扩展函数。

        mockkStatic(path.to.B.CompanionKt)
            every { any<A>().extension() } returns whatIneed
   

结果:它没有找到伴侣对象。

        mockkStatic(A::extension) {
            every { any<A>().extension() } returns whatIneed
        }

结果:编译错误 -> 'extension' 同时是一个成员和一个扩展。不允许引用此类元素。

我是否遗漏了一些关于如何模拟这个的东西? 我在阻止这种模拟的代码结构方面做错了吗?

感谢任何帮助。

【问题讨论】:

  • A.extension() 是否在 B 类本身以外的任何地方使用?
  • 是的,它实际上只是为了组织目的,因为 B 是一个存储库类,而 A.extension() 基本上是对 A 实例进行数据库操作的语法糖。
  • 那为什么要在B类中添加这样的扩展呢?如果有其他类调用它,为什么不将它添加到 A 类中?

标签: unit-testing kotlin mocking mockk extension-function


【解决方案1】:

这似乎是一件不可能的事情。这个我试了好几次都不行。

【讨论】:

  • 我也没有成功。最终将函数从伴随对象中移出到常规对象/文件中。
  • 主activity中的函数需要静态定义的情况下怎么办?我该怎么办呢
  • 我对android开发不太了解,因为我使用Kotlin进行微服务开发。话虽如此,您可以将函数放置在常规对象而不是伴随对象中,这使得它可以模拟。或者,如果在任何正式定义的范围之外,比如在“类/活动”括号之外,这也使它成为静态的。两种方式都可以通过 mockStatic 进行模拟。
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多