Android Studio + Robolectric + Gradle Class未找到例外

时间:2014-07-18 13:31:11

标签: android tdd robolectric robolectric-gradle-plugin

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

我尝试了几十种解决方案,我在google中发现了这个问题,但没有一个能够解决问题。

5 个答案:

答案 0 :(得分:5)

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

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

详细步骤如下:

  1. 当显示STUB EXCEPTION时,将第一条灰线完全复制到编辑器中。
  2. 在此行中,删除-classpath之前的所有内容以及最后一个.jar条目之后的所有内容。 (就像亚历克斯所说的那样,类路径,但也删除了其余部分)
  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”< / LI>
  5. 转到下拉菜单中的“运行配置”,开始测试或应用
  6. 在您的junit测试配置中(您之前尝试运行,而不是Android测试)将上面的文本添加为​​VM选项。
  7. 按好,运行测试并瞧,它有效!
  8. 顺便说一句,为了生成输出测试源,我必须添加

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

    到模块的build.gradle

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

答案 1 :(得分:2)

我正在努力解决同样的问题并最终使用此解决方案(适用于Android Studio 1.0.2和Robolectric 2.4):

  • 转到您单元的* .iml并将order-entryjdkType='Android SDK'一起移动到所有其他order-entry元素的底部(这会修复“Stub”-issue)

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

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

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

答案 2 :(得分:1)

问题是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排在其他所有方面。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

因此,为了克服Android Studio问题,很少有事情需要考虑,但很少有人可以推荐这些问题。

  1. 确保您使用的是JDK 1.7,目前推荐用于Android开发。 [更正您的设置]
  2. 当前的Robolectric-gradle插件版本1.0.1与android-gradle版本1.1.0兼容[检查你的build.gradle文件]
  3. 将测试放入&#34; src / test&#34;目录,并在APP build.gradle(内部&#39; android&#39;)中指定,如下所示:
  4. sourceSets {     testLocal {         setRoot(&#39; SRC /测试&#39;)     } }

    1. 右键单击&#34; src / test / java&#34;文件夹&#34;项目&#34;选项卡,然后单击&#34;将目录标记为&#34;&gt;&#34;测试源根&#34;
    2. 添加,我正在使用IDEA社区版,它工作正常。此外,我不需要破解.iml文件或深入了解IDE内的各种其他设置。