Как я могу переписать логику метода при использовании mockDomain в grails? - PullRequest
2 голосов
/ 04 мая 2011

Я хотел бы смоделировать домен всем как обычно (mockDomain(Class)), но я бы хотел перезаписать один из методов домена (точнее, beforeDelete) пользовательской логикой только для этого одного модульного теста.

Как этого достичь?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Вы можете переопределить метод beforeDelete в своем доменном классе, используя Groovy metaClass.

Класс домена:

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
}

- Вывод из testBeforeDelete -

Удаление лица 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
}

- вывод из testBeforeDeleteOverrideBeforeDelete -

Не прикасайся ко мне

1 голос
/ 04 мая 2011

Смоделируйте класс домена с помощью mockDomain как обычно, затем смоделируйте замыкание beforeDelete с помощью mockFor в этом конкретном модульном тесте.Например:

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

    ... // test delete

    myDomainClassControl.verify()
}
...