当我试图在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

当前回答

我也收到了同样的信息

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模块文件和一切工作正常。

对于Android Studio -从Android Studio 1.1 Beta 4开始,谷歌已经增加了对Android Gradle插件1.1.0-RC的支持。新的插件支持通过Android Studio使用junit 4+进行单元测试。

这仍然是实验性的,有一些手动步骤来设置它。

我在一个多模块项目(libgdx)中遇到了这个问题。其中一个模块是纯Java,并具有测试。 我的解决方案是在单元测试的运行配置中将“使用替代JRE”设置为“Java 1.8”。这确保类路径和junit 4. jar中没有android.jar。采用X流道。

在Android项目中,我有minifyEnabled = true,在我将其更改为false后,一切正常工作。

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