Robolectric 和 Android Studio 1.1.0 和库测试
Robolectric and Android Studio 1.1.0 and library testing
在实验性 AS 1.1 单元测试变体下,我无法将 Robolectric 单元测试转换为 运行。我收到的错误如下所示;
java.lang.NoClassDefFoundError: com/my/app/R$string
at com.my.app.MoneyFormatter.formatDealMessage(MoneyFormatter.java:63)
...
Caused by: java.lang.ClassNotFoundException: com.my.app.R$string
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.robolectric.bytecode.AsmInstrumentingClassLoader.loadClass(AsmInstrumentingClassLoader.java:100)
... 46 more
我通过在根目录(Snippet1 中的应用程序名称)的命令行执行命令来检索此错误;
./gradlew core:library:test
此方法适用于 Android Studio 1.1,无需启用单元测试并使用 v1.0 中的 android gradle 工具(com.android.tools.build:gradle :1.0.0).
项目配置
我的项目具有如下规定的复杂结构;
应用名称
|
|->应用程序
|->源码
|-> androidTest // Espresso helper 类 驻留在此处
|-> androidTestFlavour1 // 与 'flavour 1' 相关的 Espresso int 测试
|-> androidTestFlavour2 // 与 'flavour 2' 相关的 Espresso int 测试
|-> 味道1
|-> 味道2
|-> 主要
+ AndroidManifest.xml // 应用清单
|-> testFlavour1 // Robolectric 风味 1 的单元测试
|-> testFlavour2 // Robolectric 风味 2 的单元测试
|->核心
|->图书馆
|-> 源代码
|-> main // 库代码驻留在此处
+ AndroidManifest.xml
|-> test // Robolectric 库的单元测试
+gradle
+gradlew
+settings.gradle
+local.properties
片段 1:项目示意图
我听从了 Pivotal Labs 他们自己的各种建议以及许多其他家酿替代品,但都没有成功。
错误是什么意思,我需要更改什么才能纠正错误?
更新:
因此,在检查了用于 运行 测试的类路径后,我注意到以下库路径;
- /workspace/app/core/lib/build/intermediates/bundles/debug/classes.jar
- /workspace/app/core/lib/build/intermediates/classes/test/debug
- /workspace/app/core/lib/build/intermediates/dependency-cache/test/debug
这些目录都不包含生成的 R$string.class
文件,因此例外。包含生成的 'R' 文件的目录包括应用程序的调试和发布构建类型。所以;
- /workspace/app/core/lib/build/intermediates/classes/debug
- /workspace/app/core/lib/build/intermediates/classes/release
这表示构建过程的一部分缺少添加 "debug" 或 "release" 构建类型资源。这也支持纯 Java 测试用例(仅依赖 classes.jar)工作正常的行为。
好的!我已经开始工作了。我已将以下行添加到库构建 gradle 以强制将生成的 "R" 文件添加到测试类路径中;
sourceSets {
test.java.srcDirs += "build/generated/source/r/debug"
}
有了这个,我已经达到了 Robolectric 测试的必杀技;
./gradlew core:lib:test
基于和Espresso 2.0的集成;
./gradlew connectedAndroidTest
在 IDE 中停止对单元和集成测试的支持......哦,那是什么? 7年?!爱未遗失。感谢 向我展示了如何将内容强行添加到测试类路径。
在实验性 AS 1.1 单元测试变体下,我无法将 Robolectric 单元测试转换为 运行。我收到的错误如下所示;
java.lang.NoClassDefFoundError: com/my/app/R$string
at com.my.app.MoneyFormatter.formatDealMessage(MoneyFormatter.java:63)
...
Caused by: java.lang.ClassNotFoundException: com.my.app.R$string
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.robolectric.bytecode.AsmInstrumentingClassLoader.loadClass(AsmInstrumentingClassLoader.java:100)
... 46 more
我通过在根目录(Snippet1 中的应用程序名称)的命令行执行命令来检索此错误;
./gradlew core:library:test
此方法适用于 Android Studio 1.1,无需启用单元测试并使用 v1.0 中的 android gradle 工具(com.android.tools.build:gradle :1.0.0).
项目配置
我的项目具有如下规定的复杂结构;
应用名称 | |->应用程序 |->源码 |-> androidTest // Espresso helper 类 驻留在此处 |-> androidTestFlavour1 // 与 'flavour 1' 相关的 Espresso int 测试 |-> androidTestFlavour2 // 与 'flavour 2' 相关的 Espresso int 测试 |-> 味道1 |-> 味道2 |-> 主要 + AndroidManifest.xml // 应用清单 |-> testFlavour1 // Robolectric 风味 1 的单元测试 |-> testFlavour2 // Robolectric 风味 2 的单元测试 |->核心 |->图书馆 |-> 源代码 |-> main // 库代码驻留在此处 + AndroidManifest.xml |-> test // Robolectric 库的单元测试 +gradle +gradlew +settings.gradle +local.properties
片段 1:项目示意图
我听从了 Pivotal Labs 他们自己的各种建议以及许多其他家酿替代品,但都没有成功。
错误是什么意思,我需要更改什么才能纠正错误?
更新: 因此,在检查了用于 运行 测试的类路径后,我注意到以下库路径;
- /workspace/app/core/lib/build/intermediates/bundles/debug/classes.jar
- /workspace/app/core/lib/build/intermediates/classes/test/debug
- /workspace/app/core/lib/build/intermediates/dependency-cache/test/debug
这些目录都不包含生成的 R$string.class
文件,因此例外。包含生成的 'R' 文件的目录包括应用程序的调试和发布构建类型。所以;
- /workspace/app/core/lib/build/intermediates/classes/debug
- /workspace/app/core/lib/build/intermediates/classes/release
这表示构建过程的一部分缺少添加 "debug" 或 "release" 构建类型资源。这也支持纯 Java 测试用例(仅依赖 classes.jar)工作正常的行为。
好的!我已经开始工作了。我已将以下行添加到库构建 gradle 以强制将生成的 "R" 文件添加到测试类路径中;
sourceSets {
test.java.srcDirs += "build/generated/source/r/debug"
}
有了这个,我已经达到了 Robolectric 测试的必杀技;
./gradlew core:lib:test
基于和Espresso 2.0的集成;
./gradlew connectedAndroidTest
在 IDE 中停止对单元和集成测试的支持......哦,那是什么? 7年?!爱未遗失。感谢