11

我从https://github.com/robolectric/deckard-gradle下载了 Robolectric deckard-gradle 项目并导入到 Android Studio。

在我的第一次跑步中,我得到了

!!! JUnit version 3.8 or later expected:
    java.lang.RuntimeException: Stub!
      at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
      at junit.textui.TestRunner.<init>(TestRunner.java:54)
      at junit.textui.TestRunner.<init>(TestRunner.java:48)
      at junit.textui.TestRunner.<init>(TestRunner.java:41)

错误,我从 .iml 修复了这个问题。

然后我得到:

Class Not Found "my test class"

我尝试了几十个我在谷歌中找到的关于这个问题的解决方案,但都没有奏效。

4

5 回答 5

5

更新:Android Studio 1.1.0 为 IDE 添加了 JUNIT 4 测试支持。查看更多信息:https ://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support 。那应该修复存根异常。

Alex 的选项一是正确的答案:我现在在两个项目中使用它,很遗憾你必须这样做,但这是你现在所能做的。

详细步骤如下:

  1. 当显示存根异常时,将第一条灰线完全复制到编辑器中。
  2. 在这一行中,删除 -classpath 之前的所有内容以及最后一个 .jar 条目之后的所有内容。(就像Alex说的,classpath,后面的也删掉吧)
  3. 搜索junit,将类似如下的一行/path/in/filesystem/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:移到开头直接在“-classpath”指令之后的依赖项。
  4. 将您的测试类输出目录添加到类路径的末尾,例如 -classpath "/dependency1:/dependency2:/...:/Users/user/path/to/project/app/build/test-classes"
  5. 转到启动测试或应用程序的下拉菜单中的“运行配置”
  6. 在您的 junit 测试配置(您之前尝试运行,而不是 Android 测试)中,将上面的文本添加为​​ VM 选项。
  7. 按确定,运行测试,瞧,它可以工作了!

顺便说一句,为了生成输出测试源,我必须添加

apply plugin: 'idea'
idea {
    module {
        testOutputDir = file('build/test-classes/debug')
    }
}

到模块的 build.gradle

如果您在尝试使用 ui 时仍然遇到错误,请转到包含在 android studio 中的终端并使用 ./gradle clean check(或等效命令)为您的项目和测试运行 lint 检查。如果您的测试出现任何问题,您将在那里收到通知,并可以在 html 页面上查看结果。

于 2014-10-29T17:12:08.953 回答
2

我一直在努力解决同样的问题,最后让它与这个解决方案一起工作(对于 Android Studio 1.0.2 和 Robolectric 2.4):

  • 转到您的模块的 *.iml 并将order-entrywith移动jdkType='Android SDK'到所有其他元素的底部order-entry(这修复了“存根”问题)。

  • 同样在 *.iml 文件中,在 - 元素的output-test正下方添加以下条目output。它应该如下所示:

<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/test-classes" />
  • 最后,转到您的运行配置 Android Studio 菜单 -> 运行 -> 编辑配置
    • 添加一个新的 Gradle 配置(单击“+”-> 选择“Gradle”),将其命名为“编译测试类”(或类似名称),选择您的模块作为 Gradle 项目(只需使用输入字段旁边的图标快速选择)并用“compileDebugTestJava”填充任务,单击“应用”
    • 现在找到您的 JUnit 运行配置并在底部找到“启动前:制作”部分。单击“+”并选择“运行另一个配置”。选择“编译测试类”(或您为 Gradle 任务设置的名称),最后但并非最不重要的是将该条目移到应该已经存在的“制作”条目之前。

这对我来说很完美。现在我可以直接从 Android Studio 运行测试,而不必操作类路径。这就是为什么我觉得这更方便。

于 2015-01-09T07:33:53.250 回答
1

问题是 Android Studio 经常重写你的 .iml 文件,所以即使你修改了它,它也可能被改回来了。

选项 1:为 Android Studio 破解它

您可以做的是在您的测试运行中将类路径设置为 VM 选项,并将 JUnit 4 的路径放在其他所有内容的前面。

在您的测试运行配置中,对于 VM 选项,添加-classpathJUnit 的路径,然后是类路径的其余部分(当您尝试运行测试但它失败时,您可以从 Android Studio 输出中获取它,它位于第一行输出您从中复制消息的位置)。

例如:

-classpath "/Users/anothem/.gradle/caches/artifacts-26/filestore/junit/junit/4.11/jar/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:[the rest of your classpath]

选项 2:使用 IntelliJ

这不是真正的修复,但我想我会提到它。如果您真的不想继续使用 Android Studio,则可以改用 IntelliJ(Android Studio 的“爸爸”)。

使用 IntelliJ,您可以打开项目设置并重新排序您的包,以便 JUnit4 和 Robolectric 位于其他所有内容之前。

于 2014-07-27T17:49:31.617 回答
0

nemo 的评论已经指出了这一点。您可以修改您的 iml 文件。(不好的是这个文件经常从 android studio 重写)我使用自定义 gradle Task 在 android studio 中启用单元测试。修改 iml 文件并将路径更改为测试运行的预期路径。有时我必须运行我的测试两次才能让它运行,因为 android studio 只在下一次测试运行时进行更改,而不是当前。

这是一个完整的示例,可以包含在您的 gradle 文件中https://github.com/nenick/android-gradle-template/blob/master/Scripts/android-studio-robolectric-support.gradle

于 2014-09-09T06:02:26.257 回答
0

因此,要克服 Android Studio 问题,需要记住的事情很少,但其中很少有可以被推荐的做法。

  1. 确保您使用的是 JDK 1.7,这是迄今为止推荐用于 Android 开发的。[更正您的设置]
  2. 当前 Robolectric-gradle 插件版本 1.0.1 与 android-gradle 版本 1.1.0 兼容 [检查您的 build.gradle 文件]
  3. 将您的测试放在“src/test”目录中,并在 APP build.gradle(在 'android' 内)中指定,如下所示:

sourceSets { testLocal { setRoot('src/test') } }

  1. 右键单击“Project”选项卡中的“src/test/java”文件夹,然后单击“Mark Directory As”>“Test Sources Root”

补充一下,我正在使用 IDEA 社区版,它工作正常。此外,我不需要破解 .iml 文件或挖掘 IDE 中的各种其他设置。

于 2015-05-01T07:02:01.127 回答