Android Studio + robolelectric + Gradle类未发现异常



我从https://github.com/robolectric/deckard-gradle下载了robolelectric deck -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"

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

更新:Android Studio 1.1.0在IDE中添加了JUNIT 4测试支持。详见:https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support。这会修复STUB异常。

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

详细步骤如下:

  1. 显示STUB EXCEPTION时,将第一条灰线完全复制到编辑器中。
  2. 在这一行中,删除-classpath之前的所有内容和最后一个.jar条目之后的所有内容。(就像Alex说的,类路径,但也删除它之后的其余部分)
  3. 搜索junit并将类似于/filesystem/.gradle/aches/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页面上查看结果。

我一直在努力解决同样的问题,最终得到了这个解决方案(Android Studio 1.0.2和Robolectric 2.4):

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

  • 也在*中。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'),将其命名为'Compile test classes'(或类似的东西),选择您的模块作为Gradle项目(只需使用输入字段旁边的图标进行快速选择),并将'compileDebugTestJava'填入Tasks,点击'Apply'
    • 现在找到你的JUnit运行配置,并在底部找到"Before launch: Make"部分。点击"+",选择"Run another configuration"。选择"编译测试类"(或者你为Gradle任务设置的名称),最后但并非最不重要的是将该条目移动到应该已经存在的"Make"条目之前。

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

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

选项1: Hack it for 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就会排在其他所有包的前面。

所以,要想解决Android Studio的问题,有几件事要记住,但其中很少有可以推荐的做法。

  1. 确保你正在使用JDK 1.7,这是目前推荐的Android开发版本。[纠正设置]
  2. 当前robolelectric -gradle插件版本1.0.1兼容android-gradle版本1.1.0[检查你的构建。gradle文件]
  3. 把你的测试放到"src/test"目录下,并在APP构建中指定。gradle(在'android'内部),如下:

sourceSets {testLocal {setRoot (src/测试)}}

  • 右键单击"项目"选项卡中的"src/test/java"文件夹,单击"将目录标记为">"测试源根"
  • 只是补充一下,我正在使用IDEA社区版,它工作得很好。此外,我不需要破解.iml文件或深入IDE中的各种其他设置。

    从尼莫点的评论已经。您可以修改您的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

    最新更新