如果这是一个菜鸟问题,对不起您所有Groovy的家伙。
在SOAPUI中,我可以创建一个Groovy脚本,在其中可以为运行上下文定义一个任意变量以供以后检索。
context.previouslyUndefinedVariable = 3
def num = context.previouslyUndefinedVariable
Groovy的哪些功能允许将以前未定义的变量添加到这样的对象中?我想了解更多。
非常感谢!
答案 0 :(得分:1)
Groovy能够通过元编程为类动态添加方法。
要了解更多信息,请参阅:
答案 1 :(得分:0)
被接受的答案对SoapUI的工作方式解释不佳。
在这种情况下,WsdlTestRunContext
始终是某个SoapUI库Java类(例如Map
)的实例,并且这些都是context.getClass()
的实现。您可以检查assert context in Map
和context.someUndef
context.'someUndef'
context[someUndef]
context['someUndef']
context.getAt('someUndef')
。
当您在Map上查找属性时,Groovy使用getAt和putAt方法。您可以使用多种语法。所有这些都是等效的:
context.someUndef = 3
context.'someUndef' = 3
context[someUndef] = 3
context['someUndef'] = 3
context.putAt('someUndef', 3)
和
getAt()
我喜欢使用以上包含引号的任何内容,以便Groovy-Eclipse不会将其标记为缺少的属性。
有趣的是,Groovy在检查get
方法(称为属性)之前先寻找"foo".class
方法。
例如,考虑评估class
。 String实例没有名为getAt(String)
的属性,也没有方法getClass()
,因此它尝试的下一步是寻找具有该名称的“ get”方法,即它找到了String
,我们得到了结果:['class':'bar'].class
。
但是对于地图,getAt('class')
首先是指方法调用'bar'
,它将是['class':'bar'].getClass()
。如果我们想知道它是什么类型的地图,我们必须更加具体,并完整写出:LinkedHashMap
,它将是getClass()
。
即使Map
没有匹配的密钥,我们仍然必须指定['foo':'bar'].class
,因为['foo':'bar'].getAt('class')
仍然表示null
,即{{1 }}。