6

我正在尝试在 Android Studio 中使用 Robolectric 运行单元测试。我快到了 - 我明白了:

!!! 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)
    at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:185)
    ...

我还在类路径中看到了所有必需的依赖项。要修复此错误,我需要将 junit4 依赖项放在 android sdk 依赖项之前。不幸的是,我在项目结构部分没有看到模块,我不知道如何编辑iml文件来存档它。

这是我的项目结构的屏幕截图: 在此处输入图像描述

我的毕业文件:

sourceSets {
   testLocal {
      java.srcDir file('src/test/java')
      resources.srcDir file('src/test/resources')
   }
}

dependencies {
    // compatibility
    compile 'android.compatibility:android-support:v4-r13'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'

    testLocalCompile 'junit:junit:4.11'
    testLocalCompile 'org.robolectric:robolectric:2.2'
    testLocalCompile 'org.easytesting:fest-assert-core:2.0M10'
}

android {
    buildToolsVersion "17"
    compileSdkVersion 18

    productFlavors {
       testLocal{
       }
    }
}

我在 AS 中选择了 testLocal风味。

4

3 回答 3

4

使用 Android Studio 0.5.7,可以通过“项目结构”对话框保持依赖关系的顺序,或者只是将行androidTestCompile 'junit:junit:4.+'放在顶部 fodependencies部分。

然而,这还不足以在 Android Studio 中运行测试。新的错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:116)
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter
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)
... 3 more

所以看起来我的 junit 依赖项没有传播到 junit 运行。我正在努力使它进一步工作

于 2014-04-28T15:02:26.920 回答
4

问题似乎是由于 Android Studio 如何重写 `.iml 文件。根据 pivotal/robolectric/deccard-gradle 开发人员的说法:

注意:Android Studio 会积极地重写您的依赖项列表(您的 .iml 文件),并颠覆上面用于将 Android SDK 置于类路径底部的技术。你会得到可怕的存根!每次重新打开项目(可能更频繁)时都会出现异常。出于这个原因,我们目前推荐 IntelliJ;我们希望这可以在未来得到解决。

来源:https ://github.com/robolectric/deckard-gradle

显然您可以手动编辑这些文件,但 AS 会在您每次同步项目时重写它们。或者(deckard devs 状态),您可以使用 IntelliJ IDEA 获得更稳定的解决方案。

这些目前也是关于 Robolectric Google 小组的长时间讨论:
https ://groups.google.com/forum/#!topic/robolectric/xsOpEwtdTi4

希望 AS 团队能尽快解决这个问题。同时运行 Robolectric 和 Espresso 将是在 Android 上进行测试的一大步。

于 2014-04-25T02:52:28.280 回答
-1

Android Studio 没有 IntelliJ 那样的依赖项屏幕。直到谷歌修复了我想出的解决方法。你可以在这里阅读我的博客文章。希望这可以帮助。

于 2013-12-02T13:03:21.477 回答