当我尝试在IntelliJ IDEA中运行以下测试时,我收到消息:
“!!! JUnit 3.8或更高版本预期:”
应该注意的是,这是我在IntelliJ IDEA 9中开展的一个项目 .
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
16 回答
如果你删除
从你的
build.gradle
它将工作转到项目结构 - >平台设置,将SDK更改为1.8解决了我的问题 .
我也遇到了同样的问题,在改成build.gradle后,它对我来说很好 .
change your junit version inside build.gradle to:
在Android项目中我有
minifyEnabled = true
,在我将其更改为false
后,一切正常 .出现此问题是因为Android平台(
android.jar
)已包含JUnit类 . IDEA测试运行器加载这些类并看到它们来自旧的JUnit,而您尝试使用带注释的测试,这是新JUnit的一个功能,因此您从测试运行器获得错误 .解决方法很简单,打开
Project Structure
|Modules
|Dependencies
,然后向上移动junit-4.7.jar
,使其在类路径中出现 beforeAndroid 1.6 Platform
. 现在,测试运行器将在加载新的JUnit版本时感到高兴 .我的模块是一个java库模块,所以将JRE更改为1.8 java解决了这个问题 .
或者,您也可以通过模块设置> SDK位置> JDK全局完成,指定Oracle的JDK 8而不是Android SDK的副本 .
我有一个多模块项目(libgdx)的问题 . 一个模块是纯Java并且有测试 . 我的解决方案是在我的单元测试的运行配置中将“使用替代JRE”设置为“Java 1.8” . 这确保了类路径上没有android.jar,并且使用了junit 4.x runner .
在Android Studio 1.4中创建
Unit Test
和Android Instrument Test
时出现同样的错误,它开始变得混乱 . 为了避免这个错误 make sure your test class is fall under Android Tests on Run/Debug Configurations确保按照说明正确使用https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
确保
Build Variants
中的Test Artifact
设置为Android Instrumentation Tests
点击菜单
Run
>Edit Configuration
确保您的类/方法名称在
Android Tests
内,而不是JUnit
如果它在
JUnit
中,只需删除配置并右键单击要测试的文件,然后再次Run
. 然后它将在Android Tests
部分下创建配置,并在设备/模拟器上运行 .对于Android Studio - 从Android Studio 1.1 Beta 4开始,Google已添加对Android Gradle plugin 1.1.0-RC的支持 . 新插件使用junit 4支持通过Android Studio进行单元测试 .
这仍然是实验性的,有一些manual steps来设置它 .
对于正在阅读这篇文章但仍然与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
适合我 .
有两件事我能想象会发生
如果您的IDE尝试启动直接在模拟器上运行的Android Junit测试,则无法使用Junit4 .
如果你不小心使用了android jar提供的junit类,它们无法在普通的jvm上运行,因为android dalvik vm只有真正的编译类 .
在Android Studio 1.1中也发生了这种情况 - 虽然它应该支持没有插件的单元测试 .
在其他机器上(同一个项目,相同版本的AS),我发现在运行单元测试时,IDE不会将android.jar文件添加到类路径中,而在我的机器中它会这样做 .
我最好的猜测是,由于我们从Maven到Gradle的转换以及从intellij转移到AS,我的机器中某些设置缓存仍然存在,导致android.jar被添加到类路径中 .
我做的是从我的机器清除所有与Android相关的缓存(在c:\ users \ USRE_NAME文件夹下):. anroid .AndroidStudio .gradle .m2
之后我重新打开了项目,测试工作正常 .
仍然试图了解出了什么问题,但这应该是现在的伎俩 .
我在Android Studio 1.5中遇到过这个问题,因为我不知道我必须将“Build Variants”(主窗口的左下角)中的“Test Artifact”设置从“Android Instrumentation Tests”切换到“Unit Testing” ” . 执行此操作时,可以在“项目”窗口中看到ExampleUnitTest.java文件 .
我有同样的问题,但另一个原因 . 我在IntelliJ上使用常规的java gradle项目(不是android)但JDK设置为
Project Structure
中的Android SDK(由于某些原因是默认的JDK) . 这真是愚蠢但是IntelliJ并没有错,所以我被困在了 .当我创建自己的junit包时,我遇到了同样的错误
为了解决这个问题,我在我的应用程序gradle文件中添加了这两行,因为它解释了here:
这就是我解决它的方式:
编辑配置 - >默认值 - > Android JUnit - >将以下内容添加到工作目录:
$ MODULE_DIR $