我对域类的 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 类只是一个具有静态属性的单例:
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 中定义的正则表达式:
allowed.text.chars=[a-zA-Z0-9\\p{L}\\p{Digit}_"` $ \\-'_&;\:#()/\\.,!\\?%*|<>]+ 

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

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

我们可以使用元类操作来模拟和添加配置类吗?我尝试过但失败了。(阅读:我不知道静态类的模拟如何工作以及如何将它们添加到元类)

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

许多Thnx

请您参考如下方法:

为避免跨多个域类重复约束,您可以使用 shared constraint or a global constraint .

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

配置文件

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 
   } 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!