从 Spock 1.2 迁移到 2.0-M2 后,Maven surefire 插件未 运行 测试
Maven surefire plugin not running tests after migrating from Spock 1.2 to 2.0-M2
工作设置 -
Spock older version - 1.2-groovy-2.4
jdk version - 8
Maven surefire plugin version - 2.22.0
Maven version - 3.5.0
迁移的设置 -
Spock version - 2.0-M2-groovy-2.5
jdk version - 11
Maven surefire plugin version - 3.0.0-M4
Maven version - 3.6.3
MCVE - https://github.com/ajaydivakaran/spock_spike
升级 Spock 的目的是使其与 jdk11 兼容。
测试 class 文件存在于 target/test-classes 文件夹中,但不在 运行.
中
变体 A:JUnit 4 + Spock 2 (Groovy 2.5)
在您的 Git 存储库中,我看到您的 JUnit 测试从 JUnit 4 导入 org.junit.Test
,您将其用作 Spock Core 使用的未声明的传递依赖项。为此,您需要 JUnit 老式引擎,否则在您修复 运行 Spock 测试后,JUnit 测试将不再 运行.
如果您根据 Surefire convention 命名您的单元测试,即 *Test
、*Tests
、*TestCase
、Test*
而不是 Spock 约定 *Spec
,您也不需要配置带有额外包含的 <execution>
部分。我刚刚删除了它,因为您的样本 Spock 测试已经命名为 *Test
。
同样适用于integration tests with Maven Failsafe,这里的命名约定是*IT
、*ITCase
、IT*
,如果你以后想添加Failsafe的话。
Maven Build Helper 插件也是多余的,所以我删除了它。
最后但同样重要的是,Spock 2 依赖 groovy
作为正常导入,不再依赖 groovy-all
作为 <type>pom</type>
导入。
通过以下更改您的测试 运行 很好:
--- pom.xml (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ pom.xml (date 1589849467265)
@@ -25,6 +25,8 @@
<groovy.version>2.5.11</groovy.version>
<spock.version>2.0-M2-groovy-2.5</spock.version>
+ <junit.version>5.6.2</junit.version>
+
</properties>
<build>
@@ -64,45 +66,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
- <executions>
- <execution>
- <id>default-test</id>
- <phase>test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <includes>
- <include>**/*Test.class</include>
- <include>**/*Spec.class</include>
- <include>**/*Should.class</include>
- </includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>${build-helper-maven-plugin.version}</version>
- <executions>
- <execution>
- <id>add-test-source</id>
- <phase>generate-test-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/groovy</source>
- </sources>
- </configuration>
- </execution>
- </executions>
</plugin>
-
</plugins>
</build>
@@ -110,13 +75,18 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
+ <artifactId>groovy</artifactId>
<version>${groovy.version}</version>
- <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <version>${junit.version}</version>
<scope>test</scope>
</dependency>
-
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
变体 B:JUnit 5 + Spock 2 (Groovy 2.5)
我上面说的大部分内容仍然适用,只是您需要从 JUnit 5 Vintage 引擎切换到普通的 JUnit 5 Jupiter 引擎。然后您需要将 JUnit 测试中的导入调整为 org.junit.jupiter.api.Test
.
您项目的差异如下所示:
--- src/test/java/me/spike/SubtractionTest.java (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ src/test/java/me/spike/SubtractionTest.java (date 1589850279261)
@@ -1,6 +1,6 @@
package me.spike;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import static org.junit.Assert.assertEquals;
--- pom.xml (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ pom.xml (date 1589850279254)
@@ -25,6 +25,8 @@
<groovy.version>2.5.11</groovy.version>
<spock.version>2.0-M2-groovy-2.5</spock.version>
+ <junit.version>5.6.2</junit.version>
+
</properties>
<build>
@@ -64,45 +66,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
- <executions>
- <execution>
- <id>default-test</id>
- <phase>test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <includes>
- <include>**/*Test.class</include>
- <include>**/*Spec.class</include>
- <include>**/*Should.class</include>
- </includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>${build-helper-maven-plugin.version}</version>
- <executions>
- <execution>
- <id>add-test-source</id>
- <phase>generate-test-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/groovy</source>
- </sources>
- </configuration>
- </execution>
- </executions>
</plugin>
-
</plugins>
</build>
@@ -110,13 +75,24 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
+ <artifactId>groovy</artifactId>
<version>${groovy.version}</version>
- <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-api</artifactId>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <version>${junit.version}</version>
<scope>test</scope>
</dependency>
-
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
依赖冲突
附带说明一下,我发现您的项目中存在一些依赖版本冲突,例如Groovy 您使用的版本 2.5.11 与 Spock 使用的 2.5.8 或 JUnit Jupiter 使用的 JUnit 4.13 与 Spock 使用的 4.12。在 JUnit 5 内部,vintage 引擎还使用了不同于 Spock Core 的另一个平台引擎。
在 IntelliJ IDEA 中,您的依赖关系图如下所示(红色为冲突):
通过依赖管理部分,您可以解决冲突并简化模块中的依赖导入,从而不必再使用集中管理的版本号或范围,只要您不希望出于任何原因修改它们原因。
变体 B (JUnit 5) 中的项目看起来像这样:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${groovy.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>${spock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
</dependency>
</dependencies>
现在依赖图如下所示:
更新: 不久之后,当尝试使用更多 Spock 时,例如 class 使用 CGLIB 或 ByteBuddy 进行模拟,您会注意到它不是使用 Groovy-Eclipse 批处理编译器 3.0 和 Groovy 2.5 是个好主意。正如我们刚刚在 中讨论的那样,您始终应该使用匹配的版本。所以你要小心并保持 Groovy 编译器和 Groovy 版本同步,在这种情况下:
<groovy-eclipse-batch.version>2.5.11-01</groovy-eclipse-batch.version>
工作设置 -
Spock older version - 1.2-groovy-2.4
jdk version - 8
Maven surefire plugin version - 2.22.0
Maven version - 3.5.0
迁移的设置 -
Spock version - 2.0-M2-groovy-2.5
jdk version - 11
Maven surefire plugin version - 3.0.0-M4
Maven version - 3.6.3
MCVE - https://github.com/ajaydivakaran/spock_spike
升级 Spock 的目的是使其与 jdk11 兼容。 测试 class 文件存在于 target/test-classes 文件夹中,但不在 运行.
中变体 A:JUnit 4 + Spock 2 (Groovy 2.5)
在您的 Git 存储库中,我看到您的 JUnit 测试从 JUnit 4 导入 org.junit.Test
,您将其用作 Spock Core 使用的未声明的传递依赖项。为此,您需要 JUnit 老式引擎,否则在您修复 运行 Spock 测试后,JUnit 测试将不再 运行.
如果您根据 Surefire convention 命名您的单元测试,即 *Test
、*Tests
、*TestCase
、Test*
而不是 Spock 约定 *Spec
,您也不需要配置带有额外包含的 <execution>
部分。我刚刚删除了它,因为您的样本 Spock 测试已经命名为 *Test
。
同样适用于integration tests with Maven Failsafe,这里的命名约定是*IT
、*ITCase
、IT*
,如果你以后想添加Failsafe的话。
Maven Build Helper 插件也是多余的,所以我删除了它。
最后但同样重要的是,Spock 2 依赖 groovy
作为正常导入,不再依赖 groovy-all
作为 <type>pom</type>
导入。
通过以下更改您的测试 运行 很好:
--- pom.xml (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ pom.xml (date 1589849467265)
@@ -25,6 +25,8 @@
<groovy.version>2.5.11</groovy.version>
<spock.version>2.0-M2-groovy-2.5</spock.version>
+ <junit.version>5.6.2</junit.version>
+
</properties>
<build>
@@ -64,45 +66,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
- <executions>
- <execution>
- <id>default-test</id>
- <phase>test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <includes>
- <include>**/*Test.class</include>
- <include>**/*Spec.class</include>
- <include>**/*Should.class</include>
- </includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>${build-helper-maven-plugin.version}</version>
- <executions>
- <execution>
- <id>add-test-source</id>
- <phase>generate-test-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/groovy</source>
- </sources>
- </configuration>
- </execution>
- </executions>
</plugin>
-
</plugins>
</build>
@@ -110,13 +75,18 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
+ <artifactId>groovy</artifactId>
<version>${groovy.version}</version>
- <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <version>${junit.version}</version>
<scope>test</scope>
</dependency>
-
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
变体 B:JUnit 5 + Spock 2 (Groovy 2.5)
我上面说的大部分内容仍然适用,只是您需要从 JUnit 5 Vintage 引擎切换到普通的 JUnit 5 Jupiter 引擎。然后您需要将 JUnit 测试中的导入调整为 org.junit.jupiter.api.Test
.
您项目的差异如下所示:
--- src/test/java/me/spike/SubtractionTest.java (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ src/test/java/me/spike/SubtractionTest.java (date 1589850279261)
@@ -1,6 +1,6 @@
package me.spike;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import static org.junit.Assert.assertEquals;
--- pom.xml (revision 35c8e179569a7b45d48729d6cecf8170d02c8ed2)
+++ pom.xml (date 1589850279254)
@@ -25,6 +25,8 @@
<groovy.version>2.5.11</groovy.version>
<spock.version>2.0-M2-groovy-2.5</spock.version>
+ <junit.version>5.6.2</junit.version>
+
</properties>
<build>
@@ -64,45 +66,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
- <executions>
- <execution>
- <id>default-test</id>
- <phase>test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <includes>
- <include>**/*Test.class</include>
- <include>**/*Spec.class</include>
- <include>**/*Should.class</include>
- </includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>${build-helper-maven-plugin.version}</version>
- <executions>
- <execution>
- <id>add-test-source</id>
- <phase>generate-test-sources</phase>
- <goals>
- <goal>add-test-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>src/test/groovy</source>
- </sources>
- </configuration>
- </execution>
- </executions>
</plugin>
-
</plugins>
</build>
@@ -110,13 +75,24 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
+ <artifactId>groovy</artifactId>
<version>${groovy.version}</version>
- <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-api</artifactId>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <version>${junit.version}</version>
<scope>test</scope>
</dependency>
-
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
依赖冲突
附带说明一下,我发现您的项目中存在一些依赖版本冲突,例如Groovy 您使用的版本 2.5.11 与 Spock 使用的 2.5.8 或 JUnit Jupiter 使用的 JUnit 4.13 与 Spock 使用的 4.12。在 JUnit 5 内部,vintage 引擎还使用了不同于 Spock Core 的另一个平台引擎。
在 IntelliJ IDEA 中,您的依赖关系图如下所示(红色为冲突):
通过依赖管理部分,您可以解决冲突并简化模块中的依赖导入,从而不必再使用集中管理的版本号或范围,只要您不希望出于任何原因修改它们原因。
变体 B (JUnit 5) 中的项目看起来像这样:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${groovy.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>${spock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
</dependency>
</dependencies>
现在依赖图如下所示:
更新: 不久之后,当尝试使用更多 Spock 时,例如 class 使用 CGLIB 或 ByteBuddy 进行模拟,您会注意到它不是使用 Groovy-Eclipse 批处理编译器 3.0 和 Groovy 2.5 是个好主意。正如我们刚刚在
<groovy-eclipse-batch.version>2.5.11-01</groovy-eclipse-batch.version>