Kotlin REPL与Android Classes unStub!ed

4
我喜欢Idea / Android-Studio中的Kotlin REPL,但作为Android开发人员,我经常遇到Stub!问题。在编写单元测试时,我使用unmock来解决这个问题。是否有一种方法可以像Kotlin REPL插件中使用的方法一样使用它?

[image showing the problem[2]

2个回答

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吗?为什么这里不能使用相同的方法 - 在那里你也不需要模拟器/设备。 - ligi
看起来该插件使用了 Robolectric(http://robolectric.org/)的 Android 实现。它没有被使用的原因是因为它是非官方的,行为不能保证与真实的 Android 设备匹配。 - Kiskae
我不在意保证 - 它在单元测试中运行得非常好 - 我只想在REPL中也能有同样的效果。 - ligi

1
问题在于 IDEA 中的 Kotlin REPL 是由 Kotlin IDEA 插件提供的,该插件本身并不涉及 Android,它只查看类路径中的内容,而在这种情况下,类路径中包含的是 android.jar,其中包含了会抛出您提到的异常的存根。唯一的解决方案是要么在 Kotlin 跟踪器 上开启问题,要么深入研究 Kotlin 插件中 REPL 函数的 源代码 并发送拉取请求。使用 unmock 或甚至是用于从测试存根中删除异常的集成 Android 支持(请参见“模拟 Android 依赖项”末尾的 此处)无法解决该问题,因为它们仅影响 Gradle 构建。

感谢提供的信息,特别是repl插件源代码的链接。正如Romain Guy在聊天中所说,可以使用layoutlib实现,但我还不确定是否要投入时间。https://xkcd.com/1319/ - ligi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接