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类?