在空手道中,将 Java 函数包装在 JavaScript 函数中有什么好处?
In Karate, what is the advantage of wrapping a Java function in a JavaScript function?
我可以像这样包装一个 Java 函数:
* def myJavaMethod =
"""
function() {
var Utils = Java.type('Utils');
// use Number type in constructor
var obj = new Utils(...);
return obj.myJavaMethod();
}
"""
但我为什么要这样做?我可以在测试场景中直接使用 Java 函数,像这样:
Scenario: Test exec and error value
* def Utils = Java.type('Utils');
* def ret = Utils.exec('echo "From Java" > /home/richard//karate-test/karate-0.9.6/out.txt');
* match read('out.txt') == "From Java\n";
* match Utils.exec('exit 123') == 123
注意:exec
是一个静态方法,它使用shell来执行给定的命令。
至少我对 static 方法进行了测试,并且在没有 JavaScript 绕行的情况下工作正常。
JavaScript 包装器似乎只增加了一层额外的复杂性。
除此之外,使用 'call' 语法我只能传递一个参数(当然可以是整个对象或数组)。
但是,我可以将参数直接传递给 Java 函数(使用普通语法),甚至可以在匹配中使用结果。
(我假设参数和结果 隐式 转换为 Java 脚本值,可以是 JSON 对象或数组)。
到目前为止,我没有看到在 Java 脚本包装器中显式包装 Java 代码的优势。我假设问题出在我身上,那就是:我在这里遗漏了一些重要的点?
唯一的好处是减少打字和当你有很多代码重用的时候。例如,而不是:
* def foo = java.util.UUID.randomUUID() + ''
你定义一次:
* def uuid = function(){ return java.util.UUID.randomUUID() + '' }
然后随便调用,超级简洁:
* def json = { foo: '#(uuid())' }
我可以像这样包装一个 Java 函数:
* def myJavaMethod =
"""
function() {
var Utils = Java.type('Utils');
// use Number type in constructor
var obj = new Utils(...);
return obj.myJavaMethod();
}
"""
但我为什么要这样做?我可以在测试场景中直接使用 Java 函数,像这样:
Scenario: Test exec and error value
* def Utils = Java.type('Utils');
* def ret = Utils.exec('echo "From Java" > /home/richard//karate-test/karate-0.9.6/out.txt');
* match read('out.txt') == "From Java\n";
* match Utils.exec('exit 123') == 123
注意:exec
是一个静态方法,它使用shell来执行给定的命令。
至少我对 static 方法进行了测试,并且在没有 JavaScript 绕行的情况下工作正常。 JavaScript 包装器似乎只增加了一层额外的复杂性。 除此之外,使用 'call' 语法我只能传递一个参数(当然可以是整个对象或数组)。 但是,我可以将参数直接传递给 Java 函数(使用普通语法),甚至可以在匹配中使用结果。 (我假设参数和结果 隐式 转换为 Java 脚本值,可以是 JSON 对象或数组)。
到目前为止,我没有看到在 Java 脚本包装器中显式包装 Java 代码的优势。我假设问题出在我身上,那就是:我在这里遗漏了一些重要的点?
唯一的好处是减少打字和当你有很多代码重用的时候。例如,而不是:
* def foo = java.util.UUID.randomUUID() + ''
你定义一次:
* def uuid = function(){ return java.util.UUID.randomUUID() + '' }
然后随便调用,超级简洁:
* def json = { foo: '#(uuid())' }