Grails域单元测试 - mockFor()

时间:2009-07-30 20:17:00

标签: 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.getRandomString {-> return "nestoABC" }
    c.createMock()
    reg.beforeInsert()

运行测试时,我收到此错误:


没有这样的属性:GlobalHelper for class:RegistrationTests

groovy.lang.MissingPropertyException:没有这样的属性:类的GlobalHelper:RegistrationTests 在RegistrationTests.testConstraints(RegistrationTests.groovy:57)


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

Grails测试文档对此问题的帮助不大......

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

提前致谢

3 个答案:

答案 0 :(得分:0)

根据this文档,模拟静态方法目前无效。

答案 1 :(得分:0)

您使用的是哪个版本的Grails?

使用Grails 1.1.1,以下测试适用于您上面列出的Registration域。这应该在Grails 1.1+和Grails 1.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
    }
}

答案 2 :(得分:0)

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

def c = mockFor(GlobalHelper)

会变成

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