尝试在Intellij 2018.2.RC中执行JUnit 4测试时出现NoClassDefFoundError

时间:2018-07-24 02:56:41

标签: android gradle intellij-idea kotlin kotlintest

当尝试使用KotlinTest在Android中执行非常简单的Hello World测试时:

class ExampleUnitTest : FreeSpec() {

init {
    "Test" {
        2 + 2 shouldBe 4
    }
   }
}

尝试在IntelliJ中执行此操作时,通过单击绿色图标,出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/platform/launcher/TestExecutionListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.intellij.junit5.JUnit5IdeaTestRunner.createListeners(JUnit5IdeaTestRunner.java:39)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:45)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.launcher.TestExecutionListener
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 16 more

Process finished with exit code 1

我正在使用此依赖项:

testImplementation "io.kotlintest:kotlintest-runner-junit4:3.1.8"

JUnit 4是必需的,因为Android尚不支持JUnit 5。

在执行./gradlew test时它可以正常工作,所以我认为这只是IntelliJ的问题?

2 个答案:

答案 0 :(得分:1)

我不确定是什么原因造成的,但经过数小时无用的研究, 我找到了解决此问题的解决方法。

这似乎是IntelliJ IDEA 2018.2.RC中的错误,无论如何都会导致它使用JUnit 5执行代码。之所以这样做,是因为它在类路径中找不到任何其他TestExecutor。

一种解决方法是,在IntelliJ构建单元测试后,强制将其编译。


为此,请编辑测试配置:

enter image description here

并将Gradle任务添加到compileDebugUnitTestKotlin

enter image description here

此后,您的测试应再次变为绿色。

答案 1 :(得分:1)

我遇到了同样的问题,并且添加app:compileDebugUnitTestKotlin来运行配置对我来说不起作用。我什至用Gradle-aware Make替换了Build,以获得相同的配置,但这也无济于事。

我还尝试用@RunWith(JUnit4::class)注释类,因为您建议使用Junit 5执行该类。但这也无济于事。

尽管有所帮助,但还是降级为3.1.5。但这不是最佳解决方案,因为新版本中有一些有用的功能。

很高兴知道它可以从命令行运行。这样,我可以使用最新版本并使用app:test的Gradle运行配置运行测试,并在浏览器中查看结果。不完美,但是...