带有Junit 4.7的IntelliJ IDEA 预期的JUnit版本3.8或更高版本:”


206

当我尝试在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,最新补丁。
benstpierre


老实说,我终于在IntelliJ中使用了Android插件,硬着头皮使用了最新的Android Studio。一切都很好
Kirby

如果其他人来到这里,而他们的测试班级名称中没有“ Test”;您应该添加“测试”兄弟。给类“ GameEngine”命名会导致相同的错误,您可以通过将其命名为“ GameEngineTest”来解决。干杯!
recepinanc

Answers:


364

发生此问题的原因是Android平台(android.jar)已包含JUnit类。当您尝试使用带注释的测试(这是新JUnit的功能)时,IDEA测试运行器加载了这些类并发现它们来自旧的JUnit,因此,您会从测试运行器中得到错误。

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


9
只是为了让人们知道,这仍然是更高版本的android的问题。
克里斯·詹金斯(Chris.Jenkins)2012年

通过将android提供的依赖项放在测试依赖项之后,也解决了maven中的问题
avianey 2013年

18
我有一个使用robolectric的gradle android项目,如下所述:peterfriese.de/android-testing-with-robolectric,当我将Android Platform从classpath中的1st移开时,出现以下异常:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders

7
在IDEA 14.0.3中,用于更改亲戚顺序,应使用箭头。拖放无效。
david.perez

4
在android studio中,依赖文件是自动生成的。因此,无法向上/向下移动。有其他解决方法吗?
iMDroid

35

在此处输入图片说明

我的模块是Java库模块,因此将JRE更改为1.8 java解决了该问题。

或者,您也可以通过“模块设置”>“ SDK位置”>“ JDK”全局进行此操作,并指定Oracle的JDK 8而不是Android SDK的副本。


这实际上是有效的,并且在问题上下文中也很有意义。
AgentKnopf

就我而言,我需要为默认值的Junit更改JRE
Rafael

另一种方法:编辑您的jdk.table.xml~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlC:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlWindows上。找到该节点<name value="Android API 28 Platform" />并将其设置<annotationsPath><root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />。还要确保该<classPath>节点platforms/android-28/...在两个文件路径URL中都包含。将“ Android-SDK”调整为您的文件夹名称。
Mr-IDE

这对我有用!只需将Default(Android API 28)更改为1.8(Java)即可!
aiueoH

8

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


您实际上不需要使用1.8。选择Android SDK随附的1.7就足够了。
金斯敦

8

既创造的时候,我得到了同样的错误Unit Test,并Android Instrument Test在Android Studio中1.4+,并开始感到困惑。为了避免这种错误请确保您的测试类归入Android TestsRun/Debug Configurations

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

4
这对我有用=>如果它在JUnit中,则只需删除配置并右键单击要测试的文件,然后再次运行。然后,它将在Android测试部分下创建配置,并在设备/模拟器上运行。
Devendra Vaja

也为我工作。从test文件androidTest夹移动到文件夹后,我运行了相同的测试。完成此操作后,Android Studio并未更新运行配置
Daniil

5

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

这仍处于实验阶段,有一些手动步骤可以进行设置。


它可以工作,但是Android Studio在自动生成测试配置方面仍然存在问题,因此每次您都必须通过重新选择测试包来修复运行的配置时。否则,在测试运行过程中发生NullPointerException。
Alfishe

4

对于正在阅读本文但仍对AndroidStudio 1.0遇到同样问题的所有人。您无法在AndroidStudio中让IDE自动重新编写依赖关系顺序的情况下更改依赖关系顺序。并且,即使您设法通过修改.iml文件来更改顺序,您也会得到“找不到类...”。这是因为无法在AndroidStudio上设置测试输出路径。

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

非常适合我。


2

创建自己的junit包时出现相同的错误

在此处输入图片说明

为了解决这个问题,我已经添加了我的应用程序文件的gradle这两行,因为它的解释在这里

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

1

我可以想象发生两件事

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

1

Android Studio 1.1中也发生了这种情况-尽管它应该支持没有插件的单元测试。

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

我最好的猜测是,由于我们进行了从Maven到Gradle的转换,并且从intellij转换到AS,因此某些设置缓存保留在我的机器中某个地方,从而导致android.jar被添加到类路径中。

我所做的是清除了我机器上所有与Android相关的缓存(位于c:\ users \ USRE_NAME文件夹下):.android .AndroidStudio .gradle .m2

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

仍在尝试了解出了什么问题,但这现在应该可以解决。


1

我在Android Studio 1.5中遇到了此问题,因为我不知道我必须将“构建变体”(主窗口的左下角)中的“测试工件”设置从“ Android工具测试”切换为“单元测试” ”。完成后,您可以在“项目”窗口中看到ExampleUnitTest.java文件。


1

我有同样的问题,但又有另一个原因。我在IntelliJ上有一个常规的Java gradle项目(不是android),但是JDK被设置为Android SDK Project Structure(出于某些原因,它是默认的JDK)。这真是愚蠢,但是IntelliJ不够好,不能告诉我什么地方出了问题,所以我坚持了下来。


1

这是我解决的方法:

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

$ MODULE_DIR $


1

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

删除旧的测试配置


0

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


0

如果删除

testOptions {
    unitTests.returnDefaultValues = true
}

从你的build.gradle它将工作


0

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




0

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


0

更换你的android.jar与最新的一个文件夹。您可以从这里下载


0

在AndroidStudio中Open Project Structure -> SDK Location,您可以看到JDK位置,将其更改为自己使用的“使用嵌入式JDK”JDK,然后再更改回“使用嵌入式JDK”,这也许是可行的


0

在我的情况下,改变JRERun Configurations剂量上解决问题,但是当我点击旁边的测试功能的运行按钮,该JRE选项将重置为默认值。

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


0

我收到相同的消息

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.