Spock 测试与 junit 5 测试不 运行

Spock test together with junit 5 test does not run

我的堆栈:

我们想开始在 Spock 测试框架中编写测试。我关注了this howto,但是没有成功。当我尝试 运行 我所有的测试时,我的 spock 测试不是 运行ning。

我可以 运行 进行一次测试。我可以 "right-click" 测试和 运行 它。但是,如果我尝试 运行 整个 groovy 包(或 Java 包下的某些包),它不会 运行 那些 groovy 测试。它不会 运行 表示以下错误:

Jul 24, 2019 8:33:47 AM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoClassDefFoundError: org/junit/platform/engine/support/discovery/SelectorResolver
    at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:168)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:155)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    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.engine.support.discovery.SelectorResolver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 8 more

Jul 24, 2019 8:33:47 AM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoClassDefFoundError: org/junit/platform/engine/support/discovery/SelectorResolver
    at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:62)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:168)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:155)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    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.engine.support.discovery.SelectorResolver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 8 more

谁能解释一下为什么可行?

Spock 测试:

class TelephoneTest extends Specification {

    def "Should copy correct values from telephone buidler."() {

        given:
        TelephoneInfoType telephone = telephone().build().toOurType()

        expect:
        telephone.getCountry() == COUNTRY
        telephone.getNumber() == NUMBER
        telephone.getType() == TYPE
        telephone.getLocation() == LOCATION
    }
}

我的文件夹结构:

src/main/java
src/test/groovy
src/test/java

我想查看测试 运行ning 这意味着:我可以右键单击文件夹 src/test/groovy 一个 select 运行 测试。

这是我在 IDEA 中看到的:

所以也许您想更具体地分享一个 MCVE,即一个完整的 Maven 项目,其中包含一些虚拟 类 和测试(Spock 和 JUnit),在 GitHub 给我检查一下。


更新:my fork 检查并修复你的 MCVE 后,我可以解释哪里出了问题:

  1. 您用于 Spock 测试的 MCVE 文件夹是 'src/test/spock'。我将其重命名为 'src/test/groovy' 以便 GMavenPlus 能够找到它。这修复了 Groovy 测试编译。

  2. 在您的 POM 中,您手动覆盖了三个 JUnit Jupiter 工件的依赖版本,但是 mvn help:effective-pom 向我展示了一些其他工件仍在 5.3.2 上,而您的版本是 5.5.1。我不确定为什么你认为你需要更新它们而不是希望成为最前沿的并始终使用最新版本。无论如何,有效的 POM 还表明在你的父 POM 中有这些 JUnit-related 版本属性:

<junit-jupiter.version>5.3.2</junit-jupiter.version>
<junit.version>4.12</junit.version>

更准确地说,这些属性来自 your parent POM's own parent POM。剩下的很简单:只需覆盖您自己的 POM 中的相关 属性:

<properties>
  <junit-jupiter.version>5.5.1</junit-jupiter.version>
</properties>

现在 运行 mvn clean test 并看到正在编译 JUnit 和 Spock 测试并且 运行。 运行 上面截图中的 IntelliJ IDEA 测试现在也可以使用。

我还通过 GitHub 给你发了一个 pull request