通过Maven一起运行jUnit和spock测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Maven一起运行jUnit和spock测试相关的知识,希望对你有一定的参考价值。

我试图通过单元测试覆盖我的SpringBoot应用程序。申请书写在Kotlin。从现在开始,我使用Kotlin和jUnit进行了两次单元测试,并使用Spock进行了一次集成测试。使用Maven,我能够正确执行它们。我试图使用groovy / spock添加另一个单元测试。当我从文件运行此测试时,它可以正常工作。但是当我运行maven时,这个测试被忽略了,我不知道为什么。我已经花了几个小时试图找到解决方案,但没有运气。

这是测试文件夹结构:

├───groovy
│   │
│   └───integration
│       │   ITTestSuite.groovy
│       │
│       ├───pages
│       │       ZMainPage.groovy
│       │
│       └───test
│               ZMainSpec.groovy
│
├───kotlin
│   └───com
│       └───example
│           └───zou
│               │   ZouApplicationTests.kt
│               │
│               ├───model
│               │       ArticleTest.kt -- jUnit
│               │       PortalTest.kt -- jUnit
│               │
│               └───services
│                       TextAnalysisServiceSpec.groovy -- Spock
│                       TextAnalysisServiceTest.kt -- jUnit

Maven构建阶段:

    <build>
    <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generateStubs</goal>
                        <goal>compile</goal>
                        <goal>generateTestStubs</goal>
                        <goal>compileTests</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy-all</artifactId>
                    <version>${groovy.version}</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <wait>1000</wait>
                <maxAttempts>180</maxAttempts>
            </configuration>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                    <configuration>
                        <skip>${skipITs}</skip>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                    <configuration>
                        <skip>${skipITs}</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <configuration>
                <compilerPlugins>
                    <plugin>spring</plugin>
                </compilerPlugins>
                <jvmTarget>1.8</jvmTarget>
            </configuration>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-allopen</artifactId>
                    <version>${kotlin.version}</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
                <includes>
                    <include>**/*Spec.java</include>
                    <include>**/*Test.*</include>
                </includes>
            </configuration>
        </plugin>

问题是,每当我跑步时

mvn test

mvn verify

只启动了集成测试的jUnit测试。 TextAnalysisServiceSpec.groovy永远不会被执行。

这是Maven输出的一部分:

[INFO] --- gmavenplus-plugin:1.6:compile (default) @ zou ---
[INFO] Using Groovy 2.4.13 to perform compile.
[INFO] No sources specified for compilation.  Skipping.

我在StackOverflow上发现了几个问题几乎相同或类似的问题,但在我的项目中没有响应。

我已经尝试过的:

  1. 使用gmavenplus-plugin添加配置
  2. ** / * Spec.java这个扩展名为.groovy(很少有答案说.java可以解决问题,因为surefire不适用于groovy)
  3. 在groovy /文件夹下移动文件TextAnalysisServiceSpec.groovy

它们都不适合我。 TextAnalysisServiceTest.kt包含使用Kotlin编写的相同测试,该测试在执行期间编译和运行。但我仍然希望能够编写和运行Spock测试。

编辑:似乎问题是这个:

    <execution>
        <id>test-compile</id>
        <phase>test-compile</phase>
        <goals>
            <goal>test-compile</goal>
        </goals>
    </execution>

覆盖编译的groovy spock测试。因为如果我评论这部分配置,测试是在编译类下并在mvn测试期间运行。怎么办?

答案

这里解释了解决方案 - 编译Kotlin和Java源代码下的https://kotlinlang.org/docs/reference/using-maven.html

要编译混合代码应用程序,应在Java编译器之前调用Kotlin编译器

混合这个词非常重要,因为这也适用于groovy。 :-)

以上是关于通过Maven一起运行jUnit和spock测试的主要内容,如果未能解决你的问题,请参考以下文章

简单的 Mockito 验证在 JUnit 中有效,但在 Spock 中无效

使用 Maven 运行 spock 单元测试

JUnit:通过 eclipse 和 maven 测试运行。速度差别很大,为啥?

使用 maven 运行 junits 和 cobertura

运行测试套件无法通过 maven 在 junit5 中运行

Spock单测利器的写法