我想嘲笑一切像往常一样(mockDomain(Class)
),但我想覆盖一个域的方法(beforeDelete
是具体的)与定制逻辑只为那一个单元测试。在grails中使用mockDomain时,如何覆盖方法的逻辑?
这怎么能实现?
我想嘲笑一切像往常一样(mockDomain(Class)
),但我想覆盖一个域的方法(beforeDelete
是具体的)与定制逻辑只为那一个单元测试。在grails中使用mockDomain时,如何覆盖方法的逻辑?
这怎么能实现?
您可以使用Groovy metaClass覆盖domain类的beforeDelete方法。
域类:
class Person {
String name
boolean deleted
def beforeDelete() {
println "Deleting Person ${id}"
deleted = true
return false
}
}
单元测试:
void testBeforeDelete() {
mockDomain(Person)
def p = new Person(name:"test")
p.save()
assertEquals false, p.deleted
p.delete()
assertEquals true, p.deleted
}
--output从testBeforeDelete--
删除个人从testBeforeDeleteOverr 1
void testBeforeDeleteOverrideBeforeDelete() {
mockDomain(Person)
Person.metaClass.'static'.beforeDelete = {println 'Do not touch me'}
def p = new Person(name:"test")
p.save()
assertEquals false, p.deleted
p.delete()
assertEquals true, p.deleted
}
--output ideBeforeDelete--
不要碰我
像往常一样用mockDomain
模拟域类,然后在该特定的单元测试中模拟beforeDelete
关闭与mockFor
。例如:
void testDelete() {
mockDomain(MyDomainClass)
def myDomainClassControl = mockFor(MyDomainClass)
myDomainClassControl.demand.beforeDelete(1..1) { -> println "hello world" }
... // test delete
myDomainClassControl.verify()
}
如何获取域类的实例?当我在** md.save()**上执行** def md = new MyDomainClass()**和更高版本时,测试仍然运行** original originalDelete()**。另一方面,如果我执行** def md = myDomainClassControll.createMock()**,则md.save()会导致** java.lang.IllegalArgumentException:参数类型不匹配** – user569825 2011-05-04 18:01:15
**参数类型不匹配**似乎只消失*当我删除** mockDomain(MyDomainClass)** - 但然后我收到** junit.framework.AssertionFailedError:验证[2]:预期1..1调用('s)'beforeDelete',但被称为0次(s)。** – user569825 2011-05-04 18:03:29
好吧,'beforeDelete'事件似乎没有在grails 1.3.7下的单元测试中被解雇。作为替代方案,我建议将测试转换为集成测试。 – ataylor 2011-05-04 19:30:05
太棒了!谢谢,大卫。你能告诉我在这种情况下'静态'意味着什么? – user569825 2011-05-05 12:03:19
[Groovy Docs](http://groovy.codehaus.org/JN3525-MetaClasses#JN3525-MetaClasses-ExpandoMetaClass)在上面的例子中,我们使用ExpandoMetaClass在Person类上添加/重写一个静态方法。 – 2011-05-05 14:25:33