android - Robolectric 和 Android Studio 1.1.0 和库测试

标签 android unit-testing android-studio noclassdeffounderror robolectric

我无法让我的 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 中的应用程序名称)的命令行执行命令来检索此错误;

./gradlew core:library:test

此方法适用于 Android Studio 1.1,无需启用单元测试并使用 v1.0 (com.android.tools.build:gradle:1.0.0) 的 android gradle 工具。

项目配置

我的项目具有如下规定的复杂结构;

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

fragment 1:项目示 Intent

我听从了 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

这表示构建过程的一部分缺少添加“调试”或“发布”构建类型资源。这也支持纯 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年?!爱未遗失。感谢this answer这向我展示了如何将内容强行添加到测试类路径。

关于android - Robolectric 和 Android Studio 1.1.0 和库测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29152890/

相关文章:

java - 如何仅测试方法的一部分,该部分的测试是用spock编写在测试类中的

java - 构建项目时出错 : Program type already present: android. support.v4.app.INotificationSideChannel$Stub$Proxy

java - 在 Java 1.7 中使用 Android Studio

c# - 使用 ForPartsOf 并模拟异步方法时,NSubstitute 返回 NullReferenceException

java - 对仅更新某些属性的方法进行单元测试

android - 在 android build.gradle 文件中添加任何新的依赖项。它总是显示错误

Android MediaStore 不会设置文件名

android - 对我没有观看的视频流进行屏幕截图

android - 如何在同步的两个 View 之间实现android中的滑入和滑出动画

android - 设置初始屏幕方向