0
votes

When I try to create a functional test using:

grails create-functional-test acceptance.tests.Logout

I'm getting this error, because Spock tries to use a wrong Groovy version:

| Error Failed to compile GenerateAsyncController.groovy: startup failed: Could not instantiate global transform class org.spockframework.compiler.SpockTransform specified at jar:file:/Users/reinaldoluckman/.gradle/caches/modules-2/files-2.1/org.spockframework/spock-core/2.0-M2-groovy-3.0/396867de1bbbe11e85e197c22f0e6de07643185a/spock-core-2.0-M2-groovy-3.0.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation because of exception org.spockframework.util.IncompatibleGroovyVersionException: The Spock compiler plugin cannot execute because Spock 2.0.0-M2-groovy-3.0 is not compatible with Groovy 2.5.6. For more information, see http://docs.spockframework.org Spock artifact: file:/Users/reinaldoluckman/.gradle/caches/modules-2/files-2.1/org.spockframework/spock-core/2.0-M2-groovy-3.0/396867de1bbbe11e85e197c22f0e6de07643185a/spock-core-2.0-M2-groovy-3.0.jar Groovy artifact: file:/Users/reinaldoluckman/.sdkman/candidates/grails/4.0.4/lib/org.codehaus.groovy/groovy/jars/groovy-2.5.6.jar

But in my project only Groovy 3 is a library.

Here is my build.gradle:


buildscript {
    repositories {
        jcenter()
        mavenCentral()
        mavenLocal()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath "com.bertramlabs.plugins:asset-pipeline-gradle:3.2.5"
        classpath "org.grails.plugins:hibernate5:${gormVersion - '.RELEASE'}"
        classpath "org.grails.plugins:views-gradle:2.1.0.M1"
        classpath "gradle.plugin.com.energizedwork.webdriver-binaries:webdriver-binaries-gradle-plugin:$webdriverBinariesVersion"
    }
}

plugins {
    id "com.moowork.node" version "1.1.1"
    id "com.github.ben-manes.versions" version "0.33.0"
}

version "0.1"
group "test_project"

apply plugin:"eclipse"
apply plugin:"idea"
apply plugin:"war"
apply plugin:"org.grails.grails-web"
apply plugin:"org.grails.grails-gsp"
apply plugin:"org.grails.plugins.views-json"
apply plugin:"asset-pipeline"
apply plugin:"io.spring.dependency-management"
apply plugin:"com.energizedwork.webdriver-binaries"

repositories {
    jcenter()
    mavenCentral()
    mavenLocal()
    maven { url "https://plugins.gradle.org/m2/" }
    maven { url "https://repo.grails.org/grails/core" }
}

dependencyManagement {
    imports {
        mavenBom "org.grails:grails-bom:$grailsVersion"
    }
    applyMavenExclusions false
}

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

dependencies {

    developmentOnly("org.springframework.boot:spring-boot-devtools")

    implementation "org.springframework.boot:spring-boot-starter-logging"
    implementation "org.springframework.boot:spring-boot-autoconfigure"
    implementation "org.springframework.boot:spring-boot-starter-actuator"
    implementation "org.springframework.boot:spring-boot-starter-tomcat"
    implementation "org.grails:grails-dependencies"
    implementation "org.grails:grails-web-boot"
    implementation "org.grails:grails-core"
    implementation "org.grails:grails-datastore-rest-client:6.1.12.RELEASE"
    implementation "org.grails:grails-logging"
    implementation "org.grails.plugins:cache"
    implementation "org.grails.plugins:scaffolding"
    implementation "org.grails.plugins:hibernate5:${gormVersion - '.RELEASE'}"
    implementation "org.hibernate:hibernate-ehcache"
    console "org.grails:grails-console"
    profile "org.grails.profiles:web"
    runtime("org.springframework.boot:spring-boot-properties-migrator")
    runtime "com.bertramlabs.plugins:asset-pipeline-grails:3.2.5"
    runtime "com.h2database:h2"

    testImplementation "org.grails:grails-gorm-testing-support:$testingVersion"
    testImplementation "org.grails:grails-web-testing-support:$testingVersion"
    testImplementation "org.grails.plugins:geb"
    testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion"
    testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion"
    testRuntime "org.seleniumhq.selenium:selenium-safari-driver:$seleniumSafariDriverVersion"
    testImplementation "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion"
    testImplementation "org.seleniumhq.selenium:selenium-api:$seleniumVersion"
    testImplementation "org.seleniumhq.selenium:selenium-support:$seleniumVersion"

    implementation "com.github.jsimone:webapp-runner:9.0.27.1"
    implementation "org.grails.plugins:spring-security-core:4.0.2"
    implementation "org.grails.plugins:spring-security-rest:3.0.1"
    implementation "org.grails.plugins:postgresql-extensions:5.3.0"
    implementation "org.grails.plugins:views-json:2.1.0.M1"
    implementation "org.grails.plugins:mail:3.0.0"
    implementation 'io.github.http-builder-ng:http-builder-ng-core:1.0.3'
    runtime "org.postgresql:postgresql:42.2.11"

    // Para tirar os warnings do application.yml
    implementation "org.springframework.boot:spring-boot-configuration-processor"
}

webdriverBinaries {
    chromedriver "$chromeDriverVersion"
    geckodriver "$geckodriverVersion"
}

tasks.withType(Test) {
    systemProperty "geb.env", System.getProperty('geb.env')
    systemProperty "geb.build.reportsDir", reporting.file("geb/integrationTest")
    systemProperty "webdriver.chrome.driver", System.getProperty('webdriver.chrome.driver')
    systemProperty "webdriver.gecko.driver", System.getProperty('webdriver.gecko.driver')
}

springBoot {
    mainClassName = 'test_project.Application'
}

bootRun {
    jvmArgs('-Dspring.output.ansi.enabled=always')
    sourceResources sourceSets.main
}


assets {
    minifyJs = true
    minifyCss = true
    includes = ["fonts/*"]
}

processResources.dependsOn(['npmInstall', 'npm_run_bundle'])
assetCompile.dependsOn(['npmInstall', 'npm_run_bundle'])


task stage() {
    dependsOn clean, war
}

tasks.stage.doLast() {
    delete fileTree(dir: "build/distributions")
    delete fileTree(dir: "build/assetCompile")
    delete fileTree(dir: "build/distributions")
    delete fileTree(dir: "build/libs", exclude: "*.war")
}
war.mustRunAfter clean

task copyToLib(type: Copy) {
    into "$buildDir/server"
    from(configurations.compile) {
        include "webapp-runner*"
    }
}

stage.dependsOn(copyToLib)


Here is gradle.properties:

grailsVersion=4.1.0.M2
groovyVersion=3.0.6
gormVersion=7.1.0.M2
gradleWrapperVersion=6.6.1
testingVersion=2.2.0.M2
gebVersion=3.4
seleniumVersion=3.12.0
webdriverBinariesVersion=1.4
chromeDriverVersion=86.0.4240.22
geckodriverVersion=0.23.0
seleniumSafariDriverVersion=3.14.0

How can I make Spock (that is a transitive dependency from Geb) to use the Groovy 3 (that is already in my classpath)?

Thanks in advance.

2
In your Gradle configuration I do not see any Groovy dependency. So if it is on your class path, then it probably is a transitive dependency of whatever other stuff you have in there, maybe Grails or Geb. (Disclaimer: I use Spock + Geb + Maven, not Grails or Gradle.) Anyway, the error message The Spock compiler plugin cannot execute because Spock 2.0.0-M2-groovy-3.0 is not compatible with Groovy 2.5.6 implies that Spock wants Groovy 3, but on your class path is Groovy 2.5.6. So you need to fix your build configuration, either upgrade Groovy or downgrade to Spock 2.0.0-M2-groovy-2.5. - kriegaex
BTW, Spock 2.0.0-M3-groovy-x.y would be more up to date the M2. I am sure, Gradle has something akin to Maven's mvn dependency:tree in order to analyse your dependency tree. Use it in order to find out what is wrong with your configuration and where Groovy 2.5.6 comes from. - kriegaex
Hi, @kriegaex! Thanks for your time. About your comments: 1) Already tried that, without success (grovvy-all:3.0.6 as dependency was an attempt). 2) Thanks for the information. 3) You got it. Issue #619 is the answer. You can write that if you want. Thanks for you expertise. - reinaldoluckman

2 Answers

2
votes

A quick check shows that the current master of Geb still depends on spock-1.3-groovy-2.5, so I am not sure if you can use Geb with Spock 2.0. But it looks as if you cannot, see Geb issue #619. Consequently, you want to stick with Spock 1.3 and Groovy 2.5 for now.

0
votes

With Grails 4.1.0.M2, grails create-functional-test acceptance.tests.Logout worked as a charm. But I did some extra steps (to avoid bleeding edge, as @kriegaex says in comments).

What I did was:

  1. Updated to Grails 4.1.0.M2
  2. Rolled back to Gradle 5.1.1 (recommended version)
  3. Recreated gradle wrapper (gradle wrapper --gradle-version 5.1.1)
  4. Continued with Groovy 3.0.6 (3.0.3 gave a dependency incompatibility)
  5. Everything else came from Maven BOM associated with Grails 4.1.0.M2 (as saw in my build.gradle in my question )

But the gotcha is that Grails 4.1.0.M2 comes with Spock 2.0-M2-groovy-3.0, that solves the problem pointed out in @kriegaex answer.

Also, thanks for @JeffScottBrow for the tips in the comments.