由于 grails-3.0.1 插件应用程序中的 IllegalStateException,无法 运行 集成测试
Cannot run integration test because of IllegalStateException in grails-3.0.1 plugin application
上下文:我创建了一个名为 "samplePlugin" 的新 Grails 插件。它有一个域 class Person 和一个集成测试 PersonSpec。现在,当我 运行 grails test-app
时,测试失败并出现以下异常:
java.lang.IllegalStateException: Method on class [sampleplugin.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:52)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:165)
at sampleplugin.PersonSpec.$tt__$spock_feature_0_1(PersonSpec.groovy:25)
at sampleplugin.PersonSpec.test save_closure2(PersonSpec.groovy)
at groovy.lang.Closure.call(Closure.java:423)
at groovy.lang.Closure.call(Closure.java:439)
at grails.transaction.GrailsTransactionTemplate.doInTransaction(GrailsTransactionTemplate.groovy:67)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:64)
at sampleplugin.PersonSpec.test save(PersonSpec.groovy)
class Person.groovy 是:
package sampleplugin
class Person {
String name
}
class PersonSpec.groovy 是:
package sampleplugin
import grails.test.mixin.integration.Integration
import grails.transaction.*
import spock.lang.*
@Integration
@Rollback
class PersonSpec extends Specification {
void "canary test"() {
expect:
true == true
}
void "test save"() {
when:
new Person(name: "John Doe").save flush:true
then:
1 == Person.count()
}
}
这是示例 grails3 插件的 GitHub link https://github.com/puneetbehl/samplePlugin.git
我可以通过在 build.gradle 的依赖项下添加 compile "org.grails.plugins:hibernate"
来解决问题。似乎 Grails 插件应用程序默认没有它。下面是 build.gradle 文件:
buildscript {
ext {
grailsVersion = project.grailsVersion
}
repositories {
mavenLocal()
maven { url "https://repo.grails.org/grails/core" }
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
}
}
plugins {
id "io.spring.dependency-management" version "0.4.0.RELEASE"
id "com.jfrog.bintray" version "1.1"
}
version "0.1-SNAPSHOT"
group "org.grails.plugins"
apply plugin: 'maven-publish'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "spring-boot"
apply plugin: "org.grails.grails-plugin"
apply plugin: "org.grails.grails-gsp"
// Used for publishing to central repository, remove if not needed
apply from:'https://raw.githubusercontent.com/grails/grails-profile-repository/master/profiles/plugin/templates/grailsCentralPublishing.gradle'
apply from:'https://raw.githubusercontent.com/grails/grails-profile-repository/master/profiles/plugin/templates/bintrayPublishing.gradle'
ext {
grailsVersion = project.grailsVersion
gradleWrapperVersion = project.gradleWrapperVersion
}
sourceCompatibility = 1.7
targetCompatibility = 1.7
repositories {
mavenLocal()
mavenCentral()
maven { url "https://repo.grails.org/grails/core" }
}
dependencyManagement {
imports {
mavenBom "org.grails:grails-bom:$grailsVersion"
}
applyMavenExclusions false
}
dependencies {
provided 'org.springframework.boot:spring-boot-starter-logging'
provided "org.springframework.boot:spring-boot-starter-actuator"
provided "org.springframework.boot:spring-boot-autoconfigure"
provided "org.springframework.boot:spring-boot-starter-tomcat"
provided "org.grails:grails-web-boot"
provided "org.grails:grails-dependencies"
provided 'javax.servlet:javax.servlet-api:3.1.0'
compile "org.grails.plugins:hibernate"
testCompile "org.grails:grails-plugin-testing"
console "org.grails:grails-console"
}
task wrapper(type: Wrapper) {
gradleVersion = gradleWrapperVersion
}
上下文:我创建了一个名为 "samplePlugin" 的新 Grails 插件。它有一个域 class Person 和一个集成测试 PersonSpec。现在,当我 运行 grails test-app
时,测试失败并出现以下异常:
java.lang.IllegalStateException: Method on class [sampleplugin.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:52)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:165)
at sampleplugin.PersonSpec.$tt__$spock_feature_0_1(PersonSpec.groovy:25)
at sampleplugin.PersonSpec.test save_closure2(PersonSpec.groovy)
at groovy.lang.Closure.call(Closure.java:423)
at groovy.lang.Closure.call(Closure.java:439)
at grails.transaction.GrailsTransactionTemplate.doInTransaction(GrailsTransactionTemplate.groovy:67)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:64)
at sampleplugin.PersonSpec.test save(PersonSpec.groovy)
class Person.groovy 是:
package sampleplugin
class Person {
String name
}
class PersonSpec.groovy 是:
package sampleplugin
import grails.test.mixin.integration.Integration
import grails.transaction.*
import spock.lang.*
@Integration
@Rollback
class PersonSpec extends Specification {
void "canary test"() {
expect:
true == true
}
void "test save"() {
when:
new Person(name: "John Doe").save flush:true
then:
1 == Person.count()
}
}
这是示例 grails3 插件的 GitHub link https://github.com/puneetbehl/samplePlugin.git
我可以通过在 build.gradle 的依赖项下添加 compile "org.grails.plugins:hibernate"
来解决问题。似乎 Grails 插件应用程序默认没有它。下面是 build.gradle 文件:
buildscript {
ext {
grailsVersion = project.grailsVersion
}
repositories {
mavenLocal()
maven { url "https://repo.grails.org/grails/core" }
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
}
}
plugins {
id "io.spring.dependency-management" version "0.4.0.RELEASE"
id "com.jfrog.bintray" version "1.1"
}
version "0.1-SNAPSHOT"
group "org.grails.plugins"
apply plugin: 'maven-publish'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "spring-boot"
apply plugin: "org.grails.grails-plugin"
apply plugin: "org.grails.grails-gsp"
// Used for publishing to central repository, remove if not needed
apply from:'https://raw.githubusercontent.com/grails/grails-profile-repository/master/profiles/plugin/templates/grailsCentralPublishing.gradle'
apply from:'https://raw.githubusercontent.com/grails/grails-profile-repository/master/profiles/plugin/templates/bintrayPublishing.gradle'
ext {
grailsVersion = project.grailsVersion
gradleWrapperVersion = project.gradleWrapperVersion
}
sourceCompatibility = 1.7
targetCompatibility = 1.7
repositories {
mavenLocal()
mavenCentral()
maven { url "https://repo.grails.org/grails/core" }
}
dependencyManagement {
imports {
mavenBom "org.grails:grails-bom:$grailsVersion"
}
applyMavenExclusions false
}
dependencies {
provided 'org.springframework.boot:spring-boot-starter-logging'
provided "org.springframework.boot:spring-boot-starter-actuator"
provided "org.springframework.boot:spring-boot-autoconfigure"
provided "org.springframework.boot:spring-boot-starter-tomcat"
provided "org.grails:grails-web-boot"
provided "org.grails:grails-dependencies"
provided 'javax.servlet:javax.servlet-api:3.1.0'
compile "org.grails.plugins:hibernate"
testCompile "org.grails:grails-plugin-testing"
console "org.grails:grails-console"
}
task wrapper(type: Wrapper) {
gradleVersion = gradleWrapperVersion
}