【问题标题】:Kotlin REPL with Android Classes unStub!ed带有 Android 类 unStub!ed 的 Kotlin REPL
【发布时间】:2017-07-01 19:27:49
【问题描述】:

我喜欢 Idea / Android-Studio 中的 Kotlin REPL - 但作为一名 Android 开发人员,我经常遇到 Stub!这里的问题。在编写单元测试时,我使用unmock 来解决这个问题。有没有办法使用与 Kotlin REPL 插件相同的方法?

[

【问题讨论】:

    标签: android android-studio intellij-idea kotlin read-eval-print-loop


    【解决方案1】:

    所有 android(和 java.lang.*)类都是 Android 项目中的占位符。这是因为android没有使用标准的java类文件来存储编译后的代码,没有办法直接在电脑上运行这段代码。

    您根本无法将 REPL 与 android 类一起使用,它们只会存在于实际设备或模拟器上。

    如果您不关心正确性,则可以通过将 Robolectric 的 Android 实现添加为项目的依赖项来使用它。 为确保它不会与实际实现发生冲突,您可能应该使用专用于 REPL 的单独模块来执行此操作。

    unmock使用的Robolectic的依赖是:org.robolectric:android-all:7.1.0_r7-robolectric-0

    【讨论】:

    • 你看过 unmock 吗?在这里不能使用相同方法的原因是什么 - 你也不需要模拟器/设备
    • 看起来该插件使用了 Android 的 robolectric (robolectric.org) 实现。不使用它的原因是因为它是非官方的,并且不能保证其行为与真实的 android 设备匹配。
    • 我不关心这里的保证 - 它在单元测试中效果很好 - 只希望在 REPL 中也一样
    【解决方案2】:

    问题在于 IDEA 中的 Kotlin REPL 是由 Kotlin IDEA 插件提供的,该插件本身没有 Android 的概念,但只查看类路径中的内容,在本例中是包含存根的 android.jar抛出你提到的异常。

    使用 unmock 甚至集成的 Android 支持从测试中的存根中删除异常(请参阅“模拟 Android 依赖项”末尾的 here)将不起作用,因为这只会影响您的 Gradle 构建。

    我能想到的唯一解决方案是在Kotlin tracker 上打开一个问题,或者通过source code of the REPL function in the Kotlin plugin 挖掘并发送一个拉取请求。

    【讨论】:

    • 感谢您提供信息 - 特别是 repl 插件 src 的链接 - 正如 appendinx - Romain Guy 在聊天中说可以使用 layoutlib 实现 - 不确定我是否投入时间 - xkcd.com/1319
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2022-08-18
    相关资源
    最近更新 更多