2011-05-04 60 views

回答

2

您可以使用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--

不要碰我

+1

太棒了!谢谢,大卫。你能告诉我在这种情况下'静态'意味着什么? – user569825 2011-05-05 12:03:19

+1

[Groovy Docs](http://groovy.codehaus.org/JN3525-MetaClasses#JN3525-MetaClasses-ExpandoMetaClass)在上面的例子中,我们使用ExpandoMetaClass在Person类上添加/重写一个静态方法。 – 2011-05-05 14:25:33

1

像往常一样用mockDomain模拟域类,然后在该特定的单元测试中模拟beforeDelete关闭与mockFor。例如:

void testDelete() { 
    mockDomain(MyDomainClass) 
    def myDomainClassControl = mockFor(MyDomainClass) 
    myDomainClassControl.demand.beforeDelete(1..1) { -> println "hello world" } 

    ... // test delete 

    myDomainClassControl.verify() 
} 
+0

如何获取域类的实例?当我在** md.save()**上执行** def md = new MyDomainClass()**和更高版本时,测试仍然运行** original originalDelete()**。另一方面,如果我执行** def md = myDomainClassControll.createMock()**,则md.save()会导致** java.lang.IllegalArgumentException:参数类型不匹配** – user569825 2011-05-04 18:01:15

+0

**参数类型不匹配**似乎只消失*当我删除** mockDomain(MyDomainClass)** - 但然后我收到** junit.framework.AssertionFailedError:验证[2]:预期1..1调用('s)'beforeDelete',但被称为0次(s)。** – user569825 2011-05-04 18:03:29

+0

好吧,'beforeDelete'事件似乎没有在grails 1.3.7下的单元测试中被解雇。作为替代方案,我建议将测试转换为集成测试。 – ataylor 2011-05-04 19:30:05