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

当前回答

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

其他回答

如果你移除

testOptions {
    unitTests.returnDefaultValues = true
}

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

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

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

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

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

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

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

我能想到两件事

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

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

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

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