IntelliJ IDEA与Junit 4.7“!!! JUnit 3.8或更高版本预期:”

时间:2010-03-11 03:38:11

标签: java android junit intellij-idea

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

25 个答案:

答案 0 :(得分:360)

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

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

答案 1 :(得分:31)

enter image description here

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

或者,您也可以通过模块设置&gt;全局完成。 SDK位置&gt; JDK,指定Oracle的JDK 8而不是Android SDK的副本。

答案 2 :(得分:8)

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

答案 3 :(得分:6)

在Android Studio 1.4+中同时创建Unit TestAndroid Instrument Test时出现同样的错误,它开始变得混乱。为避免此错误,请确保您的测试类属于Android Tests上的Run/Debug Configurations

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

答案 4 :(得分:5)

对于Android Studio - 从Android Studio 1.1 Beta 4开始,Google已添加对Android Gradle plugin 1.1.0-RC的支持。新插件使用junit 4 +。

支持通过Android Studio进行单元测试

这仍然是实验性的,并且有一些manual steps来设置它。

答案 5 :(得分: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

完美适合我。

答案 6 :(得分:1)

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

enter image description here

要解决此问题,我已在我的应用程序gradle文件中添加了这两行,因为它解释了here

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

答案 7 :(得分:1)

我收到相同的消息

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 /主HomeController类的名称为:

com.example.controller.HomeController.class

和src / test HomeHontrollerTest类名称为:

com.example.test.controller.HomeControllerTest.class

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

答案 8 :(得分:1)

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

Delete the old test configuration

答案 9 :(得分:1)

这就是我解决它的方法:

修改配置 - &gt;默认值 - &gt; Android JUnit - &gt;将以下内容添加到工作目录:

$ $ MODULE_DIR

答案 10 :(得分:1)

我可以想象有两件事要发生

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

答案 11 :(得分:1)

我有同样的问题,但另一个原因。我在IntelliJ上使用常规的java gradle项目(不是android)但JDK设置为Project Structure中的Android SDK(由于某些原因是默认的JDK)。这真是愚蠢,但IntelliJ并不足以表明我的错误,所以我被困在那里。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

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

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

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

之后我重新打开了项目,测试工作正常。

仍然试图了解出了什么问题,但现在应该这样做了。

答案 14 :(得分:0)

如果删除

testOptions {
    unitTests.returnDefaultValues = true
}

来自build.gradle它将起作用

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

在更改为build.gradle后,我也遇到了同样的问题。

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

    testImplementation 'junit:junit:3.8'

答案 18 :(得分:0)

我遵循了CrazyCoder的回答,但是在依赖项中没有显示junit文件。因此我从http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm下载了一个,然后通过按右侧的加号按钮将其添加。而且有效

答案 19 :(得分:0)

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

答案 20 :(得分:0)

用最新版本的 libs 文件夹替换您的 android.jar 。 您可以从here

下载它

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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