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

我能想到两件事

如果你的IDE试图启动一个Android Junit测试,直接运行在 模拟器你不能使用Junit4。 如果你不小心使用了android jar提供的junit类,它们不能在正常的jvm上运行,因为android dalvik虚拟机只有真正编译过的类。


出现这个问题是因为Android平台(Android .jar)已经包含了JUnit类。IDEA测试运行器加载这些类,并看到它们来自旧的JUnit,而您试图使用注释测试(这是新JUnit的一个特性),因此您从测试运行器得到错误。

解决方案很简单,打开项目结构|模块|依赖项,并移动junit-4.7.jar,使其在类路径中位于Android 1.6平台之前。现在,测试运行程序将很高兴地加载新的JUnit版本。


对于那些正在阅读这篇文章并且仍然对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 -从Android Studio 1.1 Beta 4开始,谷歌已经增加了对Android Gradle插件1.1.0-RC的支持。新的插件支持通过Android Studio使用junit 4+进行单元测试。

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


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

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

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

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

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

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


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


我在Android Studio 1.5中遇到了这个问题,因为我不知道我必须在“构建变量”(主窗口的左下角)中将“测试工件”设置从“Android仪器测试”切换到“单元测试”。当您这样做时,您可以在Project窗口中看到一个ExampleUnitTest.java文件。


我在Android Studio 1.4+中创建单元测试和Android仪器测试时遇到了同样的错误,它开始变得混乱。为了避免这个错误,请确保你的测试类在运行/调试配置的Android测试下

Make sure you follow the instruction properly https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html Make sure Test Artifact in Build Variants is set to Android Instrumentation Tests Click menu Run > Edit Configuration Make sure your class/method name is inside Android Tests instead of JUnit If it is in JUnit simply delete the config and right click on the file you want to test and Run again. It will then create the config under Android Tests section and it run on device/emulator.


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


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


我的模块是一个java库模块,所以将JRE更改为1.8 java解决了这个问题。

或者,你也可以通过模块设置> SDK位置> JDK全局执行,指定Oracle的JDK 8而不是Android SDK的副本。


如果你移除

testOptions {
    unitTests.returnDefaultValues = true
}

从你的身材。Gradle会起作用的


我有同样的错误,当我创建自己的junit包

为了解决这个问题,我在我的app gradle文件中添加了这两行,如下所示:

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}

我是这样解决的:

编辑配置->默认值-> Android JUnit ->将以下内容添加到工作目录:

$MODULE_DIR$


进入项目结构->平台设置,将sdk更改为1.8 解决了我的问题。


在转换为build之后,我也面临着同样的问题。Gradle对我来说工作得很好。

在构建中更改junit版本。gradle:

    testImplementation 'junit:junit:3.8'

我遵循CrazyCoder的答案,但没有junit文件显示的依赖。所以我从http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm下载了一个,然后按下右边的加号按钮添加它。这个方法奏效了


在项目结构/SDK位置中关闭“使用嵌入式JDK”对我的情况有帮助,但我不知道它最初失败的确切原因是什么。


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


在AndroidStudio中,Open Project Structure -> SDK Location,你可以看到JDK的位置,将使用“使用嵌入式JDK”改为你自己的JDK来应用,然后更改回“使用嵌入式JDK”,这可能是工作


对我来说,这个问题是由过时/损坏的测试运行配置引起的。我只需要删除配置,然后创建一个新的配置,问题就解决了。


在我的例子中,在Run Configurations中更改JRE可以解决问题,但是当我单击测试功能旁边的Run按钮时,JRE选项将重置为默认值。

最后,类似于@CrazyLiu的回答,在项目结构- SDK位置- JDK中,选择嵌入式JDK。因为在Android Studio 3.6中没有复选框。


我也收到了同样的信息

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

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


以上都不适合我(Intellij 2019.3.5 Build #IU-193.7288.26),最后使用maven窗格上的“重新导入所有项目”按钮起作用了。


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


当我更新IDEA版本到2021.2.1时工作。


我在一个Java 11 Spring项目中遇到了同样的问题,结果是当我试图运行测试时,我放了错误的“缩短命令”选项。

使用“JAR清单”选项修复了这个问题。

IntelliJ缩短命令选项