当我试图在IntelliJ IDEA中运行以下测试时,我会收到这样的消息:

”! !JUnit 3.8或更高版本:

值得注意的是,这是我在IntelliJ IDEA 9中工作的一个Android项目。

public class GameScoreUtilTest {
    @Test
    public void testCalculateResults() throws Exception {
        final Game game = new Game();

        final Player player1 = new Player();
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(1);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(3);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        final GameResults gameResults = GameScoreUtil.calculateResults(game);

        assertEquals(4, gameResults.getScore());
    }
}

完整的堆栈跟踪看起来像这样…

!!! 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:152)
    at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:136)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

Process finished with exit code -3

当前回答

对于那些正在阅读这篇文章并且仍然对AndroidStudio 1.0有同样问题的人。你不能改变AndroidStudio的依赖顺序,IDE会自动重写它们。而且,即使您设法通过修改.iml文件来改变顺序,也会得到一个“class not found…”。这是因为测试输出路径不能在AndroidStudio上设置。

实际上,有一个解决方案可以让AndroidStudio、Junit和Robolectric一起工作。看看这个https://github.com/JCAndKSolutions/android-unit-test,并使用这个插件:https://github.com/evant/android-studio-unit-test-plugin

很适合我。

其他回答

我在Android Studio 1.1中也遇到过这种情况——尽管它应该支持没有插件的单元测试。

在其他机器上(相同的项目,相同版本的AS),我发现当运行单元测试时,IDE不会将android.jar文件添加到类路径中,而在我的机器中它会。

我最好的猜测是,由于我们从Maven到Gradle的转换,并从intellij移动到AS的一些设置缓存仍然在我的机器的某个地方,导致android.jar被添加到类路径。

我所做的是清除所有android相关的缓存从我的机器(在c:\users\USRE_NAME文件夹下): .android .AndroidStudio .gradle .m2

在那之后,我重新启动了项目,测试开始工作。

还在试图理解哪里出了问题,但这应该是现在的把戏。

我也有同样的问题,但原因不同。我在IntelliJ上使用一个常规的java gradle项目(不是android),但JDK在项目结构中被设置为android SDK(出于某些原因是默认的JDK)。这真的很愚蠢,但IntelliJ没有很好地告诉我哪里出了问题,所以我被困在那里了。

我也收到了同样的信息

JUnit version 3.8 or later expected

一个简单的初学者的错误。我在src/main和src/test上使用了相同的包名和类名(在我的例子中是HomeController类):

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--ApplicationTest.java
          +--controller
            +--HomeController.java  <---- same package and class name: not good!

这样,src/main HomeController类,以及src/test HomeController类,都有相同的完整路径:

com.example.controller.HomeController.class

结果:依赖于HomeController类的所有测试都失败了。

更改包名和/或类名可以解决问题。这里的例子,当包名和类名都被改变时:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--test                       <---- added (optional)
            +--ApplicationTest.java
            +--controller
              +--HomeControllerTest.java    <---- changed

现在,完全限定类名有所不同。src/main HomeController类名是:

com.example.controller.HomeController.class

src/test HomeHontrollerTest类名为:

com.example.test.controller.HomeControllerTest.class

由于全限定类名是唯一的,问题就消失了。

对于我来说,我确实在build时删除了android{}块中的useLibrary 'android.test.runner'行。Gradle模块文件和一切工作正常。

将libs文件夹中的android.jar替换为最新版本。 你可以从这里下载