Grails: Насмешка над действиями домена гибернации — beforeInsert

учитывая такое созвездие доменов:

abstract class A { 
    def myService 
    def beforeInsert() { 
        myService.doIt() 
    } 
} 

class B extends A { 
    def beforeInsert() { 
        super.beforeInsert() 
    } 
}

Можно ли имитировать следующие методы: - beforeInsert() в B? - перед вставкой() в A?


person kuceram    schedule 16.11.2012    source источник


Ответы (2)


Чтобы сделать вызовы сервисных методов необязательными для модульного тестирования, проще всего использовать нулевые безопасные вызовы методов:

abstract class A { 
    def myService 
    static transients = ['myService']
    def beforeInsert() { 
        myService?.doIt() 
    } 
} 

class B extends A { 
    def beforeInsert() { 
        super.beforeInsert() 
    } 
}
person krock    schedule 29.05.2015

Сохраните объекты B без сброса в модульных тестах или переопределите beforeInsert с помощью метакласса:

B.metaClass.beforeInsert = {-> }
person jenk    schedule 16.11.2012
comment
Вы проверяли это? Кажется, что Grails стирает любые обновления метакласса, которые вы делаете. - person Ron Dahlgren; 17.06.2014
comment
На самом деле, чтобы уточнить выше, похоже, что более новые версии Grails используют преобразования AST для взаимодействия с методами гибернации. Я пытаюсь выяснить, как справиться с этой же проблемой в настоящее время. - person Ron Dahlgren; 17.06.2014