首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MOP保存参数方法

用MOP保存参数方法
EN

Stack Overflow用户
提问于 2014-06-27 09:31:17
回答 2查看 33关注 0票数 0

我正在做一些与Spock与第三方应用程序的集成测试。现在我正在努力解决一个问题,我不确定我是否正确地处理这个问题。

在其中一个测试中,我连接到第三方服务以获取数组中的一些信息。然后,将这些项中的每一个传递给另一个方法,以单独处理它们。

代码语言:javascript
复制
def get3rdPartyItems = {
   [item1, item2, item3]
}

def processItem = { item ->
   //do something with item
}

get3rdPartyItems.each {
   processItem(it)
}

然后,我有一个使用get3rdPartyItems()方法连接到真实第三方服务的测试,在该方法中,我测试processItem被调用的次数与返回方法get3rdPartyItems()的次数一样多。

我想要做的是将其中一个项保存为@Shared变量,以编写另一个测试,以了解项目是否被正确处理,因为我不想模拟从第三方服务中检索到的内容,因为我想要真正的数据。

基本上,这就是我要做的:

代码语言:javascript
复制
@Shared def globalItem

MyClass.metaClass.processItem = { i ->
   if (!globalItem)
      globalItem = i
   //And now I would need to call the original method processItem
}

知道怎么做到这一点吗?我可能太过头了,所以我愿意改变解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 13:55:33

不确定这是否是您想要的,因为很难从代码和代码中看到您现有的结构,而且代码不能按原样运行,但考虑到这个类:

代码语言:javascript
复制
class MyClass {
    def get3rdPartyItems = {
        ['item1', 'item2', 'item3']
    }

    def processItem( item ) {
        println item
        //do something with item
    }

    def run() {
        get3rdPartyItems().each {
            processItem( it )
        }
    }
}

你可以这样做:

代码语言:javascript
复制
def globalItem
def oldProcessItem = MyClass.metaClass.getMetaMethod("processItem", Object)

MyClass.metaClass.processItem = { item ->
    if (!globalItem) {
        println "Setting global item to $item"
        globalItem = item
    }
    oldProcessItem.invoke( delegate, item )
}
def mc = new MyClass()
new MyClass().run()
票数 0
EN

Stack Overflow用户

发布于 2014-06-30 09:58:37

作为一个简洁的问题,这应该是在传递多个参数时将参数传递给元方法的方法:

代码语言:javascript
复制
def globalItem
def oldProcessItem = MyClass.metaClass.getMetaMethod("processItem", ["",[:]] as Object[])

MyClass.metaClass.processItem = { String p1, Map p2 ->
    if (!globalItem) {
        println "Setting global item to $item"
        globalItem = p2
    }
    oldProcessItem.invoke( delegate, [p1,p2] as Object[] )
}
def mc = new MyClass()
new MyClass().run()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24448473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档