2017-02-23 85 views
0

Я новичок во всем чертах в Groovy, поэтому заранее извиняюсь.Grails Unit Test: Mocking Objects Реализуя черты

Учитывая, что у меня есть эта черта:

trait SomeTrait { 

    public abstract AnotherService getAnotherService(); 

    public Item doSomething(Item item){ 
     // Code doing something in item1 and whatever implements this trait 
     anotherService.doSomethingElse(this, item); 
    } 
} 

И этот сервис:

class SomeService { 

    public void doThings(List<SomeTrait> traits, Item item) { 
     List<Item> newItems = [] 
     traits.each{ SomeTrait trait -> 
      newItems << trait.doSomething(item) 
     } 
     return newItems 
    } 
} 

Мне нужно найти способ, чтобы дразнить SomeTraits в тесте на единицу, так что мне нужно только издеваться метод doSomething() признака.

Я пытался делать подмену по умолчанию метода:

SomeTrait object = new Object() as SomeTrait 
object.metaClass.doSomething = {Item item -> return newItem } 

Это не работает, и он бросает исключение говоря, как:

NullPointerException: Cannot call method doSomething() on null object 

Если я издеваться метод getAnotherService хотя , модульный тест работает нормально.

Я не уверен, что я делаю неправильно с насмешкой. Это то, что абстрактные методы - единственные методы, переопределяемые в чертах? Или это насмешливо, я делаю неправильно?

ответ

0

Вы можете реализовать черты в режиме исполнения:

Object object = new Object() 
def traitedObject = object.withTraits SomeTrait 
traitedObject.metaClass.doSomething = {Item item -> return newItem }