2016-07-06 5 views
0

Я намеренно вызываю, что экземпляр cat не работает. Проходит следующий тест., делающий domain.save (failOnError: true) сбой при выполнении тестов интеграции

void testSomething() {        

     Cat.metaClass.save = { 

      throw new Exception("Asdasd") 
     } 

     shouldFail(Exception){ 

      Cat cat = new Cat(name: "asd") 
      cat.save() 

     } 


     GroovySystem.metaClassRegistry.removeMetaClass(Cat.class) 


    } 

Но, когда я устанавливаю свойство failOnError для метода сохранения, это не выполняется. Как я могу изменить сохранение с помощью metaClass, чтобы сделать исключение (failOnError: true) исключением? Я ценю любую помощь! Благодаря!

void testSomething() {        

     Cat.metaClass.save = { 

      throw new Exception("Asdasd") 
     } 

     shouldFail(Exception){ 

      Cat cat = new Cat(name: "asd") 
      cat.save(failOnError: true) 

     } 


     GroovySystem.metaClassRegistry.removeMetaClass(Cat.class) 


    } 

Одна альтернативы делать то же испытание, чтобы пройти в недопустимых параметрах экземпляра домена, так что проверка не пройдена, и исключение, но это не будет работать во всех случаях, поскольку в некоторых случаях экземпляр домена Безразлично» t требует любых параметров, заданных пользователем. Таким образом, чтобы имитировать отказ домена save(), в этом случае нам понадобится способ издеваться над сбоем сохранения. Итак, я ценю, если кто-нибудь ответит, как издеваться над сохранением с сохранением или без сохранения параметров, таких как save (flush: true), save (failOnError: true). Благодаря!

ответ

1

Ваш первый экземпляр metaClassing save() в порядке.

При попытке metaClass save (failOnError: true) вы должны изменить оператор metaClassing, чтобы он соответствовал сигнатуре фактического используемого метода. Вызов save() не совпадает с вызовом save (failOnError: true). Попробуйте это (я подозреваю, что параметр строго типизирован, поэтому я использую карту.:

Cat.metaClass.save = { Map map -> 
    throw new Exception("failOnError is true") 
}