这是域类:
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测试文档对此问题的帮助不大......
我知道使用集成测试可以很容易地解决这个问题,但我认为它也应该以这种方式工作。
提前致谢
答案 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)