为什么我可以将 groovy 闭包保存到 JMeter 的公开道具哈希表而不是 groovy 函数?

why I can save a groovy closure to JMeter's exposed props Hashtable but not a groovy function?

问题

有人知道为什么我可以将 groovy 闭包保存到 JMeter 公开的 props 哈希表而不是 groovy 函数吗?

最小示例

在一个测试计划中,在一个线程组中,在一个使用脚本语言 Groovy 3.0.3 的 JSR223 采样器中,我有以下最小的失败示例(当粘贴到Jmeter GUI 或从文件名“test.groovy”引用):

def bern = { p -> Math.random() < p }

props.put("bern", bern)
closure = props.get("bern")

log.warn("props closure call: " + closure(1.0))

def bernoulli (double p) {
    Math.random() < p
}

props.put("bernoulli", bernoulli)
funct = props.get(bernoulli)

log.warn("props function call: " + funct(1.0))

这是我的预期输出(在 JMeter 日志查看器中)

props closure call: true
props function call: true

这是我得到的日志输出

props closure call: true
...text
Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptExecution: 
groovy.lang.MissingPropertyException: No such property bernoulli for class:
 Script<jmeter generated groovy script number> ...

相关

您可以使用以下语法将函数存储到 props 中:

// def props = [:]
def bernoulli (double p) {
    Math.random() < p
}

props.put("bernoulli", this.&bernoulli)

funct = props.get("bernoulli")
println funct(1.0)

表达式 this.&bernoulli 只是使用 method pointer operator .&.

bernoulli 函数转换为闭包