我无法让Robolectric单元测试在实验性的AS 1.1单元测试版本下运行。我得到的错误如下所示;
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$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.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中为app-name )执行命令来检索此错误;
./gradlew core:library:test
此方法在未启用单元测试且未使用v1.0(com.android.tools.build:gradle:1.0.0)的android gradle工具的情况下在Android Studio 1.1中有效。
我的项目具有以下规定的复杂结构;
应用名称 | |->应用 |-> src |-> androidTest // Espresso帮助器类位于此处 |-> androidTestFlavour1 //与'flavor 1'相关的Espresso int测试 |-> androidTestFlavour2 //与'flavor 2'相关的Espresso int测试 |-> flavour1 |-> flavour2 |->主要 + AndroidManifest.xml //适用于应用程序的清单 |-> testFlavour1 //风味1的Robolectric单元测试 |-> testFlavour2 //风味2的Robolectric单元测试 |->核心 |->图书馆 |-> src |-> main //库代码位于此处 + AndroidManifest.xml |->测试//库的Robolectric单元测试 +等级 + gradlew + settings.gradle + local.properties
片段1:项目原理图
我遵循了Pivotal Labs本身的建议,以及其他许多自家酿制的替代品,均未获得成功。
错误在说什么,我需要更改使其正确吗?
更新:因此,检查了用于运行测试的类路径后,我注意到以下库路径;
这些目录都不包含生成的R$string.class
文件,因此是例外。包含生成的“ R”文件的目录包括应用程序的调试和发布构建类型。所以;
这表明缺少添加“调试”或“发布”构建类型资源的构建过程的一部分。这也备份了纯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年?!爱未遗失。对这个答案的荣誉,向我展示了如何强行将内容添加到测试类路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句