2017-02-23 97 views
0

我對Groovy中的整個特性有點新鮮,所以我提前致歉。Grails單元測試:嘲諷對象實現特性

考慮到我有這樣的特點:

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方法,單元測試工作正常。

我不知道我在做什麼錯誤的嘲笑。抽象方法是Traits中唯一可覆蓋的方法嗎?或者是我做錯的嘲弄?

回答

0

您可以實現在運行時的性狀:

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