不能在androidTest中使用Kotlin反引号的方法名称 - 错误的描述符异常

Mic*_*ł K 14 android unit-testing kotlin android-testing

在我的单元测试中,我使用Kotlin的反引号方法来提高可读性,例如

@Test fun `Foo should return bar`()
Run Code Online (Sandbox Code Playgroud)

它适用于<module>/src/test目录中的测试,但是当我尝试执行相同操作时,<module>/src/androidTest我得到一个异常:

Error:java.lang.IllegalArgumentException: bad descriptor: Lcom/packageName/MainActivityTest$Foo should return bar$1;
Error:Execution failed for task ':sample:transformClassesWithDexBuilderForDebugAndroidTest'. > com.android.build.api.transform.TransformException: org.gradle.tooling.BuildException: com.android.dx.cf.iface.ParseException: bad descriptor: Lcom/packageName/MainActivityTest$Foo should return bar$1;
Run Code Online (Sandbox Code Playgroud)

是否有一些技巧可以使它工作?

Cri*_*tan 10

添加了对函数名称中空格的支持,现在可在 API 30 中使用。

要使用它,集buildToolsVersioncompileSdkVersiontargetSdkVersion以30+和运行在Android 30+设备上测试。如果你想在测试以外的任何其他地方使用它,你也必须设置minSdkVersion为 30+。

  • 它确实适用于 30+,但有一些权衡。Android Studio 4.1.2 将这些方法强调为错误(它编译得很好)。此外,当 Orchestrator 启用时,它不起作用 - 它可以编译,但会在实例化测试时挂起。尽管如此,我们已经越来越接近了!:) (3认同)

Mat*_* R. 9

如@nhaarman所述,Android不支持反引号函数名。从Kotlin编码约定

在测试中(并且仅在测试中),可以在反引号中使用带有空格的方法名称。(请注意,Android运行时当前不支持此类方法名称。)测试代码中也允许在方法名称中使用下划线。

class MyTestCase {
    @Test fun `ensure everything works`() { ... }
    @Test fun ensureEverythingWorks_onAndroid() { ... }
}
Run Code Online (Sandbox Code Playgroud)

  • Android 和 Swift 争夺功能?它们甚至不在同一个功能范围内。Android 是一个平台,Swift 是一种编程语言。这里的整个问题——正如引用文档中最初(但不再)提到的那样——是 DEX 格式不支持函数名称中的各种字符。Android 已经修复了这个问题。Kotlin 已经支持它,并且只为尝试通过 Android 运行时测试执行此操作的人们提供注释。 (2认同)