Grails域类单元测试,约束设置有问题-java.lang.NoClassDefFoundError:无法初始化



我的域类grails单元测试抛出了这个异常:

|  java.lang.NoClassDefFoundError: Could not initialize class com.pkg.common.Configuration
at com.pkg.DomainClass$__clinit__closure1.doCall(DomainClass.groovy:10)
at org.grails.datastore.mapping.config.groovy.MappingConfigurationBuilder.evaluate(MappingConfigurationBuilder.groovy:72)
at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:51)
at org.grails.datastore.mapping.keyvalue.mapping.config.GormKeyValueMappingFactory.createMappedForm(GormKeyValueMappingFactory.java:37)
at org.grails.datastore.mapping.keyvalue.mapping.config.GormKeyValueMappingFactory.createMappedForm(GormKeyValueMappingFactory.java:27)
at org.grails.datastore.mapping.keyvalue.mapping.config.KeyValuePersistentEntity.<init>(KeyValuePersistentEntity.java:33)
at org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext.createPersistentEntity(KeyValueMappingContext.java:89)
at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntityInternal(AbstractMappingContext.java:159)
at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:152)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:133)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:129)

以下是我精简的域名类:

package com.pkg
import com.pkg.common.Configuration
class DomainClass {
String subject
static constraints = {
subject(maxSize: 100, nullable: false, blank: false, matches: Configuration.ALLOWED_TEXT_CHARS)
}
}

我的com.pkg.common.Configuration类只是一个具有静态属性的Singleton:

package com.pkg.common
import grails.util.Holders
class Configuration{
final public static String ALLOWED_TEXT_CHARS = "${Holders.grailsApplication.metadata["allowed.text.chars"]}"
}

"allowed.text.chars"是application.properties:中定义的RegEx

allowed.text.chars=[a-zA-Z0-9\p{L}\p{Digit}_"` $ \-'_&;:#()/\.,!\?%*|<>]+

现在,为什么这么痛苦只是为了设置一个约束?好吧,我需要保持我的15个以上域中的所有文本字段,在它们接受的字符方面保持一致。由于这是业务驱动的需求,我需要保持它的可配置性,这样我们就可以随时删除/添加任何新的字符,而不会为了完整性而接触太多域类。除此之外,我还想在其他服务类中使用可用的regex。

现在,这个实现在运行的应用程序、生产&测试应用程序集成:唯一的问题是单元测试用例。我能理解的是,这样的依赖关系,Grails将无法在单元测试环境中自动注入。

我们可以嘲笑&使用metaClass操作添加配置类?我试过,但失败了。(阅读:我不知道嘲笑静态类是如何工作的,以及如何将它们添加到元类中)

或者,如果有其他方法来实现这种概念?

多Thnx

为了避免在多个域类之间重复约束,可以使用共享约束或全局约束。

如果使用全局约束,那么为了使您能够从服务类访问正则表达式,请将正则表达式存储在单独的配置参数中。

Config.groovy

allowed.text.chars='bigLongRegex'
grails.gorm.default.constraints = {
subject matches: allowed.text.chars
}

服务等级

class MyService {
GrailsApplication grailsApplication
void something() {
String regex = grailsApplication.config.allowed.text.chars
}
}

如果你想编写一个测试域类约束的单元测试,记得添加@Mock注释,例如

@Mock([DomainClass])
class DomainClassTests {
void testConstraint() {
// test code goes here
}
}

最新更新