作者:帆侮听我悄悄说星星 | 来源:互联网 | 2023-05-17 12:01
我无法让我的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
我通过执行从命令行在root(snippet1中的 app-name )命令执行此错误;
./gradlew core:library:test
这种方法适用于Android Studio 1.1,无需启用单元测试,并在v1.0上使用android gradle工具(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
代码段1:项目原理图
我遵循了Pivotal Labs自己的各种建议和许多其他家庭酿造替代品,但没有成功.
什么是错误说明,我需要改变什么才能正确?
更新:
所以检查了用于运行测试的类路径后,我注意到以下库路径;
/workspace/app/core/lib/build/intermediates/bundles/debug/classes.jar
/工作区/应用程序/核心/ LIB /建立/中间体/类/测试/调试
/工作区/应用程序/核心/ LIB /构建/中间体/依赖性缓存/测试/调试
这些目录都不包含生成的R$string.class
文件,因此异常.包含生成的"R"文件的目录包括应用程序的调试和发布版本类型.所以;
/工作区/应用程序/核心/ LIB /建立/中间体/类/调试
/工作区/应用程序/核心/ LIB /建立/中间体/类/释放
这表明添加"调试"或"发布"构建类型资源时缺少构建过程的一部分.这也支持纯Java测试用例(仅依赖于classes.jar)的行为.
1> OceanLife..:
好!我有它的工作.我已将以下行添加到库构建gradle中,以强制将生成的"R"文件添加到测试类路径中;
sourceSets {
test.java.srcDirs += "build/generated/source/r/debug"
}
有了这个,我已经达到了Robolectric测试的必杀技;
./gradlew core:lib:test
和基于Espresso 2.0的集成;
./gradlew connectedAndroidTest
在IDE中停止时钟以获得单元和集成测试支持....哦,那是什么?7年?!爱未遗失.感谢这个答案向我展示了如何强行将东西添加到测试类路径中.