Grails单元测试:模拟对象实现特征

时间:2017-02-23 06:10:52

标签: unit-testing grails traits

我对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方法,单元测试工作正常。

我不确定我在嘲笑中做错了什么。是抽象方法是特征中可以覆盖的唯一方法吗?或者是嘲笑我做错了?

1 个答案:

答案 0 :(得分:0)

您可以在运行时实现特征:

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