【问题标题】:Android Studio + Robolectric + Gradle Class Not Found ExceptionAndroid Studio + Robolectric + Gradle 类未找到异常
【发布时间】:2014-09-09 15:58:13
【问题描述】:

我从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"

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

【问题讨论】:

  • 您遇到问题了吗?我在同一条船上! :(
  • @nemo 抱歉,我找不到任何解决方案。我认为使用最新版本的 android studio 会导致这个问题。我放弃了寻找解决方案,因为我向 robolectric 团队发送了大量邮件并在 google 群组的 robolectric 组中打开主题,但仍然没有解决方案,没有帮助......
  • 哦,我想我修好了。将此行添加到您的 iml 文件中:&lt;output-test url="file://$MODULE_DIR$/build/test-classes" /&gt;。它应该位于 iml 文件中的 &lt;output url=.... 元素下。还要确保test-output 的路径与创建实际类的路径相对应。更不用说您需要将test gradle 任务添加到您的 AS 以便编译您的测试。有关更多信息,请参阅this link,您应该很高兴。希望有帮助!
  • 我尝试了这个解决方案,但它对我不起作用。我希望这个对你有用。我没有太多时间尝试新的测试解决方案。也许以后我可以再试一次。感谢您的帮助。
  • 不能真正解决您的问题,但您可以从命令行运行测试。

标签: android tdd robolectric robolectric-gradle-plugin


【解决方案1】:

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

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. 按 ok,运行测试,瞧,它成功了!

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

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

到模块的 build.gradle

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

【讨论】:

  • 嗯,在这之后我的测试类没有找到异常
  • 我忘了说你还必须添加你的测试类输出目录,看看我更新的答案
  • @Andev 如果我已经配置了apply插件idea等,但在build下没有test-classes目录怎么办?
  • @Andev 是的,我都调查过了
【解决方案2】:

我在同样的问题上苦苦挣扎,终于让它与这个解决方案一起工作(适用于 Android Studio 1.0.2 和 Robolectric 2.4):

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

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

<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 运行测试,而不必操作类路径。这就是为什么我觉得这样更方便。

【讨论】:

  • 我不了解其他人,但这对我不起作用:(我的 Robolectric 测试课仍然找不到
  • Marcel,你有没有像这里描述的那样设置你的 build.grade [1]。然后,当您在 Android Studio 终端中执行“./gradlew clean test”时,它是否会在项目的 app/build 子文件夹中生成文件夹“test-classes”?我想确定您的问题是由尝试从 IDE 运行测试引起的,还是 Gradle 和 Robolectric 的一般配置问题。 [1]github.com/robolectric/robolectric-gradle-plugin
  • 是的,我从零开始,现在我正在工作:) ./gradlew clean test 太慢了 :(
  • 好的,那么你的配置是正确的。继续并删除 test-classes 文件夹。尝试从 IDE 启动,看看它是否再次生成。确保将 标记添加到您的 *.iml 并尝试使用 compileTestDebugJava 任务(注意:与上面帖子中提到的任务相比,TestDebug 已更改)。
【解决方案3】:

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

选项 1:为 Android Studio 破解它

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

在您的测试运行配置中,对于 VM 选项,添加 -classpath 然后是 JUnit 的路径,然后是您的类路径的其余部分(当您尝试运行测试但它失败时,您可以从 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 排在其他所有内容之前。

【讨论】:

  • 感谢您的回答。我尝试了您的第一个解决方案,但结果仍然相同,而且我在一家公司工作,所以我没有机会使用 intellij。
【解决方案4】:

因此,要解决 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”内)中指定,如下所示:

源集{ 测试本地{ setRoot('src/test') } }

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

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

【讨论】:

    【解决方案5】:

    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

    【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2020-03-06
    • 2013-10-16
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多