spring 启动应用程序的 Spock 单元测试中未找到给定包含的测试

No tests found for given includes on Spock unit tests for spring boot app

在 IntelliJ IDEA 中使用 groovy Spock 单元测试设置新的 spring 启动 java 项目。我的第一个单元测试无法达到 运行。我从 IntelliJ 内部创建它,它在 src/test/groovy.

这是单元测试。

package com.heavyweightsoftware.orders.pojo

import com.heavyweightsoftware.util.FixedDecimal
import spock.lang.Specification

class ItemOrderedTest extends Specification {
    public static final String          ITEM_ID = "OU812"
    public static final String          ITEM_NAME = "Eddie V."
    public static final int             ITEM_QUANTITY = 5
    public static final FixedDecimal    ITEM_UNIT_PRICE = new FixedDecimal(35.62, 2)

    static ItemOrdered getItemOrdered() {
        ItemOrdered result = new ItemOrdered()

        result.itemId = ITEM_ID
        result.quantity = ITEM_QUANTITY
        result.itemName = ITEM_NAME
        result.unitPrice = ITEM_UNIT_PRICE

        return result;
    }

    def "GetQuantity"() {
        given: "A test item"
        ItemOrdered testItem = getItemOrdered()

        when: "Getting Value"
        int result = testItem.quantity

        then: "Should be correct"
        result == ITEM_QUANTITY
    }

    def "GetItemId"() {
        given: "A test item"
        ItemOrdered testItem = getItemOrdered()

        when: "Getting Value"
        String result = testItem.itemId

        then: "Should be correct"
        result == ITEM_ID
    }

    def "GetItemName"() {
        given: "A test item"
        ItemOrdered testItem = getItemOrdered()

        when: "Getting Value"
        String result = testItem.itemName

        then: "Should be correct"
        result == ITEM_NAME
    }

    def "GetLineTotal"() {
        given: "A test item"
        ItemOrdered testItem = getItemOrdered()

        when: "Getting Total"
        FixedDecimal result = testItem.lineTotal

        then: "Should be correct"
        FixedDecimal total = new FixedDecimal(178.10, 2)
        result == total
    }

    def "GetUnitPrice"() {
        given: "A test item"
        ItemOrdered testItem = getItemOrdered()

        when: "Getting Value"
        FixedDecimal result = testItem.unitPrice

        then: "Should be correct"
        result == ITEM_UNIT_PRICE
    }
}

这是我在 IntelliJ 中单击双箭头时 运行 完整单元测试的输出...

Testing started at 12:47 PM ...
Starting Gradle Daemon...
Connected to the target VM, address: '127.0.0.1:33391', transport: 'socket'
Gradle Daemon started in 621 ms

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> No tests found for given includes: [com.heavyweightsoftware.orders.pojo.ItemOrderedTest](filter.includeTestsMatching)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.6.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD FAILED in 4s
4 actionable tasks: 1 executed, 3 up-to-date
Disconnected from the target VM, address: '127.0.0.1:33391', transport: 'socket'

和测试设置的屏幕截图:

这是我的 build.gradle 文件:

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.heavyweightsoftware'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
    // for heavyweight software dependencies
    flatDir {
        dirs 'libs'
    }
    // Spock snapshots are available from the Sonatype OSS snapshot repository
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}

dependencies {
    // heavyweight software libraries
    compile fileTree(dir: 'libs', include: ['*.jar'])

    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'mysql:mysql-connector-java'

    // mandatory dependencies for using Spock
    compile "org.codehaus.groovy:groovy-all:3.0.5"
    testImplementation platform("org.spockframework:spock-bom:2.0-M1-groovy-2.5")
    testImplementation "org.spockframework:spock-core"
    testImplementation "org.spockframework:spock-junit4" // you can remove this if your code does not rely on old JUnit 4 rules

    // optional dependencies for using Spock
    testImplementation "org.hamcrest:hamcrest-core:1.3" // only necessary if Hamcrest matchers are used
    testImplementation "net.bytebuddy:byte-buddy:1.9.3"          // allows mocking of classes (in addition to interfaces)
    testImplementation "org.objenesis:objenesis:2.6"    // allows mocking of classes without default constructor (together with CGLIB)

    // spring dependencies
    implementation (
            'org.springframework.boot:spring-boot-configuration-processor',
            'org.springframework.boot:spring-boot-starter-data-jpa',
            'org.springframework.boot:spring-boot-starter-web',
    )

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

我试图找到与此相关的所有问题,但其中 none 似乎有所帮助。好像没有找到我的单元测试源码。

免责声明:我是 100% Maven 用户。 Gradle 对我来说更像是试错。但我对 Spock 的问题很感兴趣,所以我试一试。

您需要将 Groovy 插件添加到您的构建文件中:

plugins {
  // ...
  id 'java'
  id 'groovy'
}

这也将帮助 IDEA 识别这是一个 Groovy 项目,您可以 运行 从 src/test/groovy.

进行测试

接下来,你会得到测试编译错误,因为你使用的明显不匹配

  • org.spockframework:spock-bom:2.0-M1-groovy-2.5 对比
  • org.codehaus.groovy:groovy-all:3.0.5,

  • Groovy 2.5
  • 的 Spock 版本
  • 但是Groovy3.

所以要么降级 Groovy 要么升级 Spock。另外,M1不是最新的,最好用M3。

  // mandatory dependencies for using Spock
  testCompile "org.codehaus.groovy:groovy:2.5.13"
  testImplementation platform("org.spockframework:spock-bom:2.0-M3-groovy-2.5")

现在您的测试应该可以编译并且运行。不过,我没有检查测试本身。无论如何,如果没有 类 under test,我就无法 运行 它。

摆脱 org.spockframework:spock-junit4 依赖是可选的。如前所述,Spock 2.x 基于 JUnit 5,因此如果您的项目中没有任何使用 JUnit 4 功能的遗留 Spock 测试,例如 @RunWith for PowerMock 或类似丑陋的东西,您不需要需要它。

也许您想将构建文件更改为与 Spock sample project 中的文件更相似。


2021-07-20更新:为了回答another question,我刚刚再次打开了theis example project。在做的过程中,我注意到在使用 sourceCompatibility = '11' 之类的东西时需要小心,但是 运行 在较旧的 JDK(例如 8)上构建构建。这将导致以下情况,counter-intuitive Gradle 错误:

Execution failed for task ':test'.
> No tests found for given includes: [com.heavyweightsoftware.orders.pojo.ItemOrderedTest](filter.includeTestsMatching)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

只有当 运行使用 Gradle 参数 --debug 进行测试时,您才会看到根本原因(日志标签和时间戳已删除):

Gradle Test Executor 31 FAILED
    org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'com.heavyweightsoftware.orders.pojo.ItemOrderedTest'.
        at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53)
        (...)

        Caused by:
        java.lang.UnsupportedClassVersionError: com/heavyweightsoftware/orders/pojo/ItemOrderedTest has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
            at java.lang.ClassLoader.defineClass1(Native Method)
            (...)

我使用了这个解决方案。只需删除:

test {
   useJUnitPlatform()
}

这是我的 build.gradle:

plugins {
    id 'java'
    id 'groovy'
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'org.yourcompany.common.dataflow.plugin' version '0.1.13'
    id 'com.github.jk1.dependency-license-report' version '1.16'
}

group = 'org.yourcompany.dataflow'
version = '0.0.1'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    maven {
        url "http://nexus.yourcompany.ru:8081/repository/maven-public/"
    }
}
ext {
    set('springCloudVersion', "2020.0.1")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-stream'
    implementation 'org.springframework.cloud:spring-cloud-stream-binder-kafka'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.kafka:spring-kafka'


    // third party
    compile 'io.dgraph:dgraph4j:20.11.0'


    // yourcompany
    implementation 'org.yourcompany:common_dataflow_annotations:0.1.11'
    implementation('org.yourcompany:common_service:0.2.27') {
        exclude group: 'io.springfox', module: 'springfox-swagger2'
    }


    // test and dev
    testCompile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.5.6'
    testImplementation group: 'org.spockframework', name: 'spock-core', version: '1.3-groovy-2.5'
    testImplementation group: 'org.spockframework', name: 'spock-spring', version: '1.3-groovy-2.5'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    compileOnly 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.kafka:spring-kafka-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

像上面提到的 Alex 一样为我添加以下作品。

test {
    useJUnitPlatform()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:3.0.8'
    testCompile 'org.spockframework:spock-core:2.0-groovy-3.0'
}