我对Groovy中的整个Traits事情都不熟悉,所以我提前道歉。
鉴于我有这个特性:
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 :(得分:0)
您可以在运行时实现特征:
Object object = new Object()
def traitedObject = object.withTraits SomeTrait
traitedObject.metaClass.doSomething = {Item item -> return newItem }