当我尝试在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
答案 0 :(得分:360)
发生此问题是因为Android平台(android.jar
)已包含JUnit类。 IDEA测试运行器加载这些类并看到它们来自旧的JUnit,而您尝试使用带注释的测试,这是新JUnit的一个特性,因此您从测试运行器中获得错误。
解决方案很简单,打开Project Structure
| Modules
| Dependencies
,然后向上移动junit-4.7.jar
,以便在类路径中之前 Android 1.6 Platform
。现在,测试运行器将在加载新的JUnit版本时感到高兴。
答案 1 :(得分:31)
我的模块是一个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 Test
和Android Instrument Test
时出现同样的错误,它开始变得混乱。为避免此错误,请确保您的测试类属于Android Tests
上的Run/Debug Configurations
Test Artifact
中的Build Variants
设置为Android Instrumentation Tests
Run
&gt; Edit Configuration
Android Tests
内,而不是JUnit
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包时,我遇到了同样的错误
要解决此问题,我已在我的应用程序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)
答案 9 :(得分:1)
这就是我解决它的方法:
修改配置 - &gt;默认值 - &gt; Android JUnit - &gt;将以下内容添加到工作目录:
$ $ MODULE_DIR
答案 10 :(得分:1)
我可以想象有两件事要发生
答案 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)
答案 24 :(得分:0)
对我来说,我确实在 bulid.gradle 模块文件的 android {} 块中删除了 useLibrary 'android.test.runner' 行一切正常。