【问题标题】:How to mock final class with Mockito 2 on Java Module in Android project?如何在 Android 项目的 Java 模块上使用 Mockito 2 模拟最终类?
【发布时间】:2017-04-09 11:40:52
【问题描述】:

我有一个Android Clean Architecture project 用 Kotlin 编写,包含 3 个模块:

  • 数据(Android 库)
  • 域(Java 库)
  • 演示文稿(Android 应用程序)

这 3 个模块每个都有用 junit 编写的单元测试。但是对于 Kotlin,默认情况下每个类都是 final 的。我很快就遇到了问题:如何使用 mockito 模拟 final 类

现在可以使用Mockito 2

可以通过 mockito 扩展机制通过创建包含单行的文件 /mockito-extensions/org.mockito.plugins.MockMaker 来完成:

mock-maker-inline

此解决方案在数据模块(Android 库)和 演示模块(Android 应用程序)但不适用于我的 域模块(Java 库).

我知道已经有人问过这个问题(How to mock a final class with mockitoMock objects calling final classes static methods with Mockito),但我没有找到我想要的答案。

【问题讨论】:

  • 你的意思是它在那个模块中不起作用?你已经创建了mock-maker-inline 的文件,但它仍然给你关于模拟最终类的错误?
  • @zsmb13 是的,我有以下错误:“Mockito 无法模拟/间谍因为:final class”

标签: java android junit mockito kotlin


【解决方案1】:

您可以默认使用内联模拟方法,方法是将您的 Gradle 依赖项从正常的 Mockito 依赖项更改:

compile "org.mockito:mockito-core:$mockito_version"

...到以下内容:

compile "org.mockito:mockito-inline:$mockito_version"

这样您就不必依赖使用“资源文件夹中的文件”方法激活内联模拟,我发现这种方法有时很不稳定。

【讨论】:

  • 我的救星。 :DD
  • 这是否也适用于 Android 依赖项? androidTestImplementation 'org.mockito:mockito-android:2.27.0'
【解决方案2】:

Mockito 的 MockMaker 只能用于单元测试(在 JVM 上运行)。对于那些在仪器测试 (androidTest) 中模拟 Kotlin 类时遇到问题的人,请尝试使用 DexOpener 库。它使 Kotlin 类、属性和方法open,允许它们的模拟。

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多