我无法让我的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上使用android gradle工具的Android Studio 1.1(com.android.tools.build:gradle:1.0.0)。
我的项目具有如下规定的复杂结构;
app-name | |->app |->src |-> androidTest // Espresso helper classes reside here |-> androidTestFlavour1 // Espresso int tests relating to 'flavour 1' |-> androidTestFlavour2 // Espresso int tests relating to 'flavour 2' |-> flavour1 |-> flavour2 |-> main + AndroidManifest.xml // Manifest for apps |-> testFlavour1 // Robolectric unit tests for flavour 1 |-> testFlavour2 // Robolectric unit tests for flavour 2 |->core |->library |-> src |-> main // Library code resides here + AndroidManifest.xml |-> test // Robolectric unit tests for library +gradle +gradlew +settings.gradle +local.properties
Snippet 1 :项目原理图
我已经遵循了Pivotal Labs自己和许多其他家庭酿造替代品的各种建议而没有成功。
错误说什么,我需要改变什么才能把它改正?
更新 因此,在检查了用于运行测试的类路径后,我注意到以下库路径;
这些目录都不包含生成的R$string.class
文件,因此是例外。包含生成的“R”文件的目录包括应用程序的调试和发布版本类型。所以;
这表示缺少添加“debug”或“release”构建类型资源的构建过程的一部分。这也支持纯Java测试用例(仅依赖于classes.jar)的行为。
答案 0 :(得分:5)
OK!我有它的工作。我已将以下行添加到库构建gradle中,以强制将生成的“R”文件添加到测试类路径中;
sourceSets {
test.java.srcDirs += "build/generated/source/r/debug"
}
有了这个,我已经达到了 Robolectric 测试的必杀技;
./gradlew core:lib:test
和基于Espresso 2.0 的集成;
./gradlew connectedAndroidTest
停止IDE中的单元和集成测试支持的时钟....哦,那是什么? 7年?!爱未遗失。感谢this answer向我展示了如何强行将东西添加到测试类路径中。