我的代码如下:
def randomInt = RandomUtil.getRandomInt(1,200);
log.info randomInt
def chars = (("1".."9") + ("A".."Z") + ("a".."z")).join()
def randomString = RandomUtil.getRandomString(chars, randomInt) //works well with this code
log.info randomString
evaluate("log.info new Date()")
evaluate('RandomUtil.getRandomString(chars, randomInt)') //got error with this code
我想使用Groovy在SoapUI中评估一个像{classname}。{methodname}的字符串,就像上面一样,但是这里出现错误,如何处理并使其按我期望的那样正常工作?
我尝试过自爆:
evaluate('RandomUtil.getRandomString(chars, randomInt)') //got error with this code
错误如下:
CST 2019年5月23日22:26:30:错误:发生错误[没有这样的属性:类com.hypers.test.apitest.util.RandomUtil的getRandomString(chars,randomInt)],请参见错误日志详细信息
答案 0 :(得分:0)
以下代码:
log = [info: { println(it) }]
class RandomUtil {
static def random = new Random()
static int getRandomInt(int from, int to) {
from + random.nextInt(to - from)
}
static String getRandomString(alphabet, len) {
def s = alphabet.size()
(1..len).collect { alphabet[random.nextInt(s)] }.join()
}
}
randomInt = RandomUtil.getRandomInt(1, 200)
log.info randomInt
chars = ('a'..'z') + ('A'..'Z') + ('0'..'9')
def randomString = RandomUtil.getRandomString(chars, 10) //works well with this code
log.info randomString
evaluate("log.info new Date()")
evaluate('RandomUtil.getRandomString(chars, randomInt)') //got error with this code
模拟您的代码,可以运行,并在运行时产生以下输出:
~> groovy solution.groovy
70
DDSQi27PYG
Thu May 23 20:51:58 CEST 2019
~>
我组成了RandomUtil类,因为您没有包含它的代码。
我认为您看到错误的原因是您使用以下命令定义了变量char
和randomInt
:
def chars = ...
和
def randomInt = ...
这会将变量放入本地脚本范围。请参阅this stackoverflow answer以获得说明,并提供指向将各种内容放入脚本全局范围的不同方法的文档的链接,以及有关其工作方式的说明。
基本上,您的常规脚本代码隐式是groovy Script class的实例,而该实例又与之相关联的隐式Binding instance。编写def x = ...
时,变量是局部范围的,编写x = ...
或binding.x = ...
时,变量是在脚本绑定中定义的。
evaluate
方法使用与隐式脚本对象相同的绑定。因此,我上面的示例起作用的原因是,我省略了def
并只键入了chars =
和randomInt =
,这将变量放入脚本绑定中,从而使它们可用于{{ 1}}表达式。
尽管我不得不说,尽管如此,措词evaluate
对我来说真的很奇怪...我本来希望No such property: getRandomString(chars, randomInt)
或No such method
等。
共享No such property: chars
的代码可能会有所帮助。