Unit testing Grails域单元测试-mockFor()

Unit testing Grails域单元测试-mockFor(),unit-testing,grails,mocking,Unit Testing,Grails,Mocking,这是域类: class Registration { String email String generatedKey def beforeInsert = { String newToken = GlobalHelper.getRandomString() generatedKey = newToken } } 这是单元测试的相关部分: def c = mockFor(GlobalHelper) c.demand.static.ge

这是域类:

class Registration {

  String email
  String generatedKey

  def beforeInsert = {
      String newToken = GlobalHelper.getRandomString()
      generatedKey = newToken
  }
}
这是单元测试的相关部分:

    def c = mockFor(GlobalHelper)
    c.demand.static.getRandomString {-> return "nestoABC" }
    c.createMock()
    reg.beforeInsert()
运行测试时,出现以下错误:


类:RegistrationTests没有这样的属性:GlobalHelper

groovy.lang.MissingPropertyException:没有此类属性:类:RegistrationTests的GlobalHelper at RegistrationTests.testConstraints(RegistrationTests.groovy:57)


GlobalHelper类位于Groovy源文件夹中,前面提到的第57行是带有mockFor()方法的行

Grails测试文档在这个问题上不是很有用

我知道使用集成测试很容易解决这个问题,但我认为它也应该以这种方式工作


提前感谢

根据文档,模拟静态方法目前不起作用。

您使用的是哪个版本的Grails

使用Grails1.1.1,以下测试适用于上面列出的
注册
域。这应该通过测试插件在Grails1.1+和Grails1.0.x上运行

您需要确保单元测试扩展了
GrailsUnitTestCase
。我犯过好几次这样的错误

import grails.test.*

class RegistrationTests extends GrailsUnitTestCase {

    void testBeforeInsert() {
        def reg = new Registration()
        reg.generatedKey = "preBeforeInsert"
        String randomString = "nestoABC"

        def c = mockFor(GlobalHelper)
        c.demand.static.getRandomString {-> return randomString }

        assertNotSame(reg.generatedKey, randomString)
        reg.beforeInsert()
        assertSame(reg.generatedKey, randomString)

        c.verify() //Verify the demands
    }
}

我遇到了这个问题,并通过完全限定要模拟的类的类名来解决它。以你为例:

def c = mockFor(GlobalHelper)
将成为

def c = mockFor(com.example.fully.qualified.GlobalHelper)

不幸的是,我认为这不是问题所在。这一行已经出现了异常:在这部分代码中甚至没有提到def c=mockFor(GlobalHelper)静态方法……我使用的是grails1.1,所以这可能是问题所在。GrailsUnitTestCase已扩展,但有些内容已损坏。Grails1.1.1目前不是一个选项,所以我做了这件事,它正在工作:GlobalHelper.metaClass.static.getRandomString={->return“nestoABC”}在向元类添加方法时一定要小心。您需要确保将它们清理干净,否则可能会在其他测试中遇到问题。如果在测试套件中运行,我的测试是否有效?是否导入GlobalHelper类?