【问题标题】:IntelliJ IDEA with Junit 4.7 "!!! JUnit version 3.8 or later expected:"带有 Junit 4.7 的 IntelliJ IDEA “!!!预计 JUnit 版本 3.8 或更高版本:”
【发布时间】:2011-01-26 05:08:56
【问题描述】:

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

【问题讨论】:

  • Intellij 9,最新补丁。
  • 老实说,我最终决定在 IntelliJ 中使用 Android 插件,然后硬着头皮使用最新的 Android Studio。一切都很好
  • 以防其他人来到这里,而他们的测试类名称中没有“测试”;您应该添加“测试”兄弟。将您的类命名为“GameEngine”会导致相同的错误,您可以通过将其设置为“GameEngineTest”来解决它。干杯!

标签: java android junit intellij-idea


【解决方案1】:

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

解决方法很简单,打开Project Structure | Modules | Dependencies,然后将junit-4.7.jar 向上移动,使其在类路径中 Android 1.6 Platform 之前。现在测试运行器会很高兴,因为它会加载新的 JUnit 版本。

【讨论】:

  • 只是为了让人们意识到这仍然是更高版本的 android 的问题。
  • 通过在测试依赖项之后放置android提供的依赖项也解决了maven中的问题
  • 我有一个使用 robolectric 的 gradle android 项目,如下所述:peterfriese.de/android-testing-with-robolectric 当我将 Android 平台从类路径中的第一个移开时,我得到以下异常:Class not found: "com.example.intellijgradletest.MainActivityTest"
  • 在 IDEA 14.0.3 中更改依赖顺序,您应该使用箭头。拖放不起作用。
  • 在android studio中,依赖文件是自动生成的。因此无法向上/向下移动。有没有其他方法可以解决这个问题?
【解决方案2】:

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

或者,您也可以通过 Module Settings > SDK Location > JDK 全局执行此操作,指定 Oracle 的 JDK 8 而不是 Android SDK 的副本。

【讨论】:

  • 这确实有效,并且考虑到问题的上下文也很有意义。
  • 在我的情况下,我需要在 Defaults 中为 Junit 更改 JRE
  • 另一种方式:在 Windows 上在 ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlC:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xml 编辑您的 jdk.table.xml。找到节点 &lt;name value="Android API 28 Platform" /&gt; 并将其 &lt;annotationsPath&gt; 设置为 &lt;root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" /&gt; 。还要确保 &lt;classPath&gt; 节点在两个文件路径 URL 中都包含 platforms/android-28/...。将“Android-SDK”调整为您的文件夹名称。
  • 这对我有用!只需从 Default(Android API 28) 更改为 1.8 (Java) 即可!
【解决方案3】:

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

【讨论】:

  • 你真的不需要使用 1.8。选择Android sdk不自带的1.7就够了。
【解决方案4】:

我在 Android Studio 1.4+ 中同时创建 Unit TestAndroid Instrument Test 时遇到了同样的错误,并且开始感到困惑。为避免此错误确保您的测试类在Run/Debug Configurations 上属于Android Tests

  1. 确保您正确遵循说明https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. 确保Build Variants 中的Test Artifact 设置为Android Instrumentation Tests
  3. 点击菜单Run > Edit Configuration
  4. 确保你的类/方法名在Android Tests而不是JUnit
  5. 如果它在JUnit 中,只需删除配置并右键单击要测试的文件并再次单击Run。然后它将在Android Tests 部分下创建配置,并在设备/模拟器上运行。

【讨论】:

  • 这对我有用 => 如果它在 JUnit 中,只需删除配置并右键单击要测试的文件并再次运行。然后它将在 Android 测试部分下创建配置,并在设备/模拟器上运行。
  • 也为我工作。在将其从 test 文件夹移动到 androidTest 文件夹后,我运行了相同的测试。执行此操作后,Android Studio 没有更新运行配置
【解决方案5】:

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

这仍然是实验性的,有一些manual steps 可以设置它。

【讨论】:

  • 它可以工作,但 Android Studio 仍然存在自动生成测试配置的问题,因此每次您必须通过重新选择测试包来修复运行配置。否则在测试运行期间出现 NullPointerException。
【解决方案6】:

对于所有正在阅读这篇文章但仍然遇到 AndroidStudio 1.0 问题的人。您无法更改 AndroidStudio 中的依赖顺序,IDE 会自动重新编写它们。而且,即使您设法通过修改 .iml 文件来更改顺序,您也会得到“找不到类...”。这是因为在 AndroidStudio 上无法设置 Test 输出路径。

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

非常适合我。

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 你太棒了!
    【解决方案8】:

    我在创建自己的 junit 包时遇到了同样的错误

    为了解决这个问题,我在我的应用程序 gradle 文件中添加了这两行,正如 here 所解释的那样:

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

    【讨论】:

      【解决方案9】:

      我收到了同样的信息

      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
      

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

      【讨论】:

      • 我也遇到了同样的问题
      【解决方案10】:

      我可以想象会发生两件事

      • 如果您的 IDE 尝试启动 Android 直接在 模拟器你不能使用 Junit4。
      • 如果您不小心使用了 android jar 提供的 junit 类,它们将无法在正常的 jvm 上运行,因为只有 android dalvik vm 的真正编译类。

      【讨论】:

        【解决方案11】:

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

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

        我的最佳猜测是,由于我们从 Maven 到 Gradle 以及从 intellij 到 AS 的转换,一些设置缓存保留在我的机器中的某个位置,导致 android.jar 被添加到类路径中。

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

        之后我重新打开了项目并且测试成功了。

        仍在尝试了解问题所在,但现在应该可以解决问题。

        【讨论】:

          【解决方案12】:

          我在 Android Studio 1.5 中遇到了这个问题,因为我不知道我必须将“Build Variants”(主窗口的左下角)中的“Test Artifact”设置从“Android Instrumentation Tests”切换到“单元测试”。完成后,您可以在“项目”窗口中看到一个 ExampleUnitTest.java 文件。

          【讨论】:

            【解决方案13】:

            我遇到了同样的问题,但出于另一个原因。我在 IntelliJ 上使用了一个常规的 java gradle 项目(不是 android),但 JDK 在Project Structure 中设置为 Android SDK(由于某些原因是默认的 JDK)。这真的很愚蠢,但 IntelliJ 并不足以告诉我出了什么问题,所以我被困住了。

            【讨论】:

              【解决方案14】:

              我就是这样解决的:

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

              $MODULE_DIR$

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

                  【讨论】:

                    【解决方案17】:

                    如果你删除

                    testOptions {
                        unitTests.returnDefaultValues = true
                    }
                    

                    从您的build.gradle 它将起作用

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

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

                        【讨论】:

                          【解决方案20】:

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

                          【讨论】:

                            【解决方案21】:

                            libs 文件夹中的 android.jar 替换为最新的。 可以从here下载

                            【讨论】:

                              【解决方案22】:

                              在AndroidStudio,Open Project Structure -&gt; SDK Location,可以看到JDK的位置,把use "Use embedded JDK"改成你自己的JDK申请,然后改回"Use嵌入式JDK”,它可能工作

                              【讨论】:

                                【解决方案23】:

                                就我而言,将JRE 更改为Run Configurations 即可解决问题,但是当我单击测试功能旁边的运行按钮时,JRE 选项将重置为默认值。

                                最后,类似于@CrazyLiu 的回答,在Project Structure - SDK Location - JDK 中,选择Embedded JDK。因为 Android Studio 3.6 中没有复选框。

                                【讨论】:

                                  【解决方案24】:

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

                                  【讨论】:

                                    【解决方案25】:

                                    对我来说,我确实删除了 bulid.gradle 模块文件中 android {} 块中的 useLibrary 'android.test.runner' 行一切正常。

                                    【讨论】:

                                      【解决方案26】:

                                      我也遇到了同样的问题,改成 build.gradle 后它对我来说工作正常。

                                      将 build.gradle 中的 junit 版本更改为:

                                          testImplementation 'junit:junit:3.8'
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 2015-08-18
                                        • 2018-03-24
                                        • 1970-01-01
                                        • 2015-11-07
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2021-08-09
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多