java - 从命令行绑定(bind)变量来测试 groovy 脚本

标签 java binding groovy command-line-interface

我有一个与 GroovyScriptEngine 结合使用的 groovy 脚本:

public static void main(String[] args) {
    GroovyScriptEngine gse = new GroovyScriptEngine(new String[] {"/home/user/tmp"});
    Binding varSet = new Binding();
    varSet.setVariable("testVar", "Hello World");
    gse.run("printHello.groovy", varSet);
}

这在 java 中运行得很好。 printHello.groovy 开始保留已定义的所有绑定(bind)变量。脚本“/home/user/tmp/printHello.groovy”是这样的:

println("${testVar} !!!")

我想要的是能够测试从命令行调用它的脚本,但我还没有找到将绑定(bind)变量传递给我的脚本的方法。

$ groovy printHello.groovy [???]

这对于测试非常有用。

最佳答案

您可以在脚本调用后传递所需的参数:

$ groovy groovyAuthDefault.groovy user pass

在脚本中,所有参数都可以通过 args 变量访问。 More info .

这就是您要找的吗?

更新

找到了解决方案,但它有一些限制,也许可以绕过它们,但不知 Prop 体如何。 正如我上面所写,当您从命令行调用脚本时,您可以传递保存在 args 列表中的参数。问题在于 GroovyScriptEngine 不使用其 main 方法调用外部脚本 - 没有 args 列表,因此它会失败并显示MissingPropertyException。这个想法是设置假的args

java:

public static void main(String[] args) {
    GroovyScriptEngine gse = new GroovyScriptEngine(new String[] {"/home/user/tmp"});
    Binding varSet = new Binding();
    varSet.setVariable("testVar", "Hello World");
    varSet.setVariable("args", null); //null, empty string, whatever evaluates to false in groovy
    gse.run("printHello.groovy", varSet);
}

printHello.groovy:

if(args) {
    setBinding(new Binding(Eval.me(args[0])))
}
println("${testVar} !!!")

printHello.groovy中检查了args。如果它的计算结果为 true,则意味着脚本是从带有参数的命令行调用的,并且设置了一个新的 Binding - 从传递的参数的第一个元素进行计算(普通 groovy 脚本扩展了 groovy.lang.Script 。如果 args 计算结果为 false,则表示脚本是使用 GroovyScriptEngine 运行的。

命令行调用:

groovy printHello.groovy [testVar:\'hi\']

还可以添加异常处理以及其他改进。希望有帮助。

关于java - 从命令行绑定(bind)变量来测试 groovy 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526678/

相关文章:

java - 如何为 HTTP GET 的多个键值参数设计 REST URI

java - 删除继承类 JPA

java - java中使用weibull分布的随机数生成

c# - 绑定(bind)到内部属性?

grails - 无法使用JsonBuilder引用局部变量

java - 导入数据时,thymeleaf 和 ajax 有什么区别?

wpf - 如何将 "IsDirty"属性添加到 LINQ to SQL 实体?

wpf - 在代码隐藏文本 block 中绑定(bind)字符串属性

java - 斯波克。如何模拟java.lang.Class?

testing - chalice : How I do mock other methods of a class under test which might be called internally during testing