【问题标题】:Android kotlin mockMaker issuesAndroid kotlin mockMaker 问题
【发布时间】:2018-05-21 10:39:58
【问题描述】:

您好,我正在尝试模拟最终类(因为 kotlin 中的所有类默认都是最终类)并在我的 gradle 中添加了以下依赖项:

testImplementation 'junit:junit:4.12'
testImplementation 'au.com.dius:pact-jvm-consumer-junit_2.11:3.5.10'
testImplementation "org.mockito:mockito-android:2.13.0"
testImplementation 'org.mockito:mockito-inline:2.13.0'
testImplementation "org.mockito:mockito-core:2.13.0"
//testImplementation 'io.mockk:mockk:1.8'
testImplementation 'org.assertj:assertj-core:3.8.0'

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'junit:junit:4.12'
androidTestImplementation "org.mockito:mockito-core:2.13.0"
androidTestImplementation "org.mockito:mockito-android:2.13.0"
androidTestImplementation 'org.mockito:mockito-inline:2.13.0'
androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.2"

mockito-inline 应该使您能够模拟最终的 kotlin 类,因此我使用 testImplementation 和 androidTestImplementation 添加到我的 java 单元测试和仪器测试中

在构建项目时,我收到以下错误:

More than one file was found with OS independent path 'mockito-extensions/org.mockito.plugins.MockMaker'

有什么想法吗?如果我删除了 mockitio 内联的 androidTestImplementation,它编译得很好,但是在运行 intrumental 测试时,我得到了 mockito 错误,说它不能模拟最终类。

【问题讨论】:

    标签: android kotlin mockito


    【解决方案1】:

    为了能够在 Kotlin 中模拟最终类,您需要创建一个文件 org.mockito.plugins.MockMaker(字面意思)只包含这一行

    mock-maker-inline
    

    并将其放入 test/resources/mockito-extensions.

    更多信息请阅读https://antonioleiva.com/mockito-2-kotlin/

    【讨论】:

    • 我不认为这是真的了。这就是内联依赖的重点。另外,我很确定我们(还)不能模拟 androidTest 源集中的最终类。 Android SDK 的一些限制。
    • 对我来说很好。您是否尝试过使用此文件运行单元测试?会不会像这里所说的那样 - stackoverflow.com/a/40992880/3569545
    • 这种方法一切正常。我在我的单元测试中使用它。你想嘲笑什么?消息“在与操作系统无关的路径 'mockito-extensions/org.mockito.plugins.MockMaker' 中发现了多个文件”可以说有几个库正在放置这样的文件,您是否需要在 build.gradle 中导入所有这些文件?
    • 将此文件放在 androidTest 资源目录中为我清除了这个问题 - 直到我迁移到 androidx 并且不得不更新许多库(如 mockito)之后才需要这个
    【解决方案2】:

    mockito-inline 不适用于仪器测试。为了能够在仪器测试中模拟最终类,您只需要包含以下行:

    androidTestImplementation com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.0

    更多详情请参考其Github page

    This thread 也可能有用。

    【讨论】:

      【解决方案3】:

      根据this answer,您不能在androidTest 中模拟最终课程-这是在 Mockito Github 问题跟踪器here 中解释的限制:

      目前没有真正的可能性使这个 [模拟最终类] 在 Android 中工作,因为它缺少我们在其之上运行的检测 API。 Android VM 不是标准 VM,仅实现 Java 规范的一个子集。只要谷歌不选择扩展它的JVM,恐怕这个功能就行不通了。

      【讨论】:

      • 所以我只需要让课程开放吗?
      • @jonney 你能依赖接口而不是具体的最终类吗?
      • 您说的是在 Java 中模拟 final 类。但这个问题涉及到 Kotlin。在 Kotlin 中这是可能的。您不必为要模拟的每个类添加 open 关键字。
      • 你这样做了,否则你怎么能让课程没有最终?不,我需要使用该类的正确 impl,我确实有接口,但我使用间谍测试实际的 Impl 并只是模拟下划线数据,但仍然让我的 impl 对模拟数据执行真实世界的逻辑
      【解决方案4】:

      就我而言,我收到此错误是因为我使用 implementation "org.mockito:mockito-inline:2.13.0" 而不是 testImplementation "org.mockito:mockito-inline:2.13.0"

      【讨论】:

        猜你喜欢
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        • 2021-07-27
        • 2021-12-26
        • 2018-12-25
        相关资源
        最近更新 更多