Spock测试与junit 5测试一起无法运行

Old*_*eer 1 java groovy spock spring-boot

我的堆栈:

  • 想法2019.1.3
  • Springboot 2.1.6
  • Java 11
  • Maven的3.8.0
  • Groovy 2.5
  • Spock 1.3
  • 朱尼木星5.5.1
  • Junit Vintage 5.5.1
  • GMavenPlus插件2.7.1

我们想开始在Spock测试框架中编写测试。我遵循了此方法,但是没有成功。当我尝试运行所有测试时,我的Spock测试未运行。

我能够进行一项测试。我可以在测试上“右键单击”并运行它。但是,如果我尝试运行整个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
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么可能吗?

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我的文件夹结构:

src/main/java
src/test/groovy
src/test/java
Run Code Online (Sandbox Code Playgroud)

我希望看到测试正在运行,这意味着:我可以右键单击文件夹src/test/groovy,选择运行测试。

kri*_*aex 5

这是我在IDEA中看到的:

从IDEA运行Groovy测试

因此,也许您想更具体一点并在GitHub上共享一个MCVE,即一个完整的Maven项目,其中包含一些虚拟类和测试(Spock和JUnit),供我检查。


更新:在检查并修复您的MCVE后,可以解释出什么问题了:

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

  2. 在您的POM中,您手动覆盖了三个JUnit Jupiter工件的依赖版本,但mvn help:effective-pom向我展示了在版本5.5.1时,其他一些仍在5.3.2上。我不知道为什么您除了需要不断更新并始终使用最新版本之外,还需要更新它们。无论如何,有效的POM还会显示您的父POM中存在以下与JUnit相关的版本属性:

<junit-jupiter.version>5.3.2</junit-jupiter.version>
<junit.version>4.12</junit.version>
Run Code Online (Sandbox Code Playgroud)

更确切地说,这些属性是从父POM自己的父POM。其余的操作很简单:只需在您自己的POM中覆盖相关属性即可:

<properties>
  <junit-jupiter.version>5.5.1</junit-jupiter.version>
</properties>
Run Code Online (Sandbox Code Playgroud)

现在运行mvn clean test,看看JUnit和Spock测试都正在编译和运行。像上面的屏幕快照一样,从IntelliJ IDEA运行测试现在也可以进行。

我还通过GitHub 向您发送了请求请求