【问题标题】:In Karate, what is the advantage of wrapping a Java function in a JavaScript function?在空手道中,将 Java 函数包装在 JavaScript 函数中有什么好处?
【发布时间】:2020-11-26 15:51:44
【问题描述】:

我可以像这样包装一个 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 包装器似乎只是增加了一层额外的复杂性。 除此之外,使用“调用”语法我只能传递一个参数(诚然可以是整个对象或数组)。 但是,我可以将参数直接传递给 Java 函数(使用普通语法),甚至可以在匹配中使用结果。 (我假设参数和结果被隐式转换为 JavaScript 值,可以是 JSON 对象或数组)。

到目前为止,我还没有看到在 JavaScript 包装器中显式包装 Java 代码的优势。我假设问题出在我身上,即:我在这里遗漏了一些重要的点?

【问题讨论】:

    标签: java testing interop karate java-interop


    【解决方案1】:

    唯一的好处是减少打字和当你有大量的代码重用。例如,而不是:

    * def foo = java.util.UUID.randomUUID() + ''
    

    你定义一次:

    * def uuid = function(){ return java.util.UUID.randomUUID() + '' }
    

    然后在任何地方调用,超级简洁:

    * def json = { foo: '#(uuid())' }
    

    【讨论】:

    • 确实,假设重用,您的示例非常紧凑
    • 我可能发现了另一种必须使用 JavaScript 包装器的情况?例如: * def request = ... \n * def ret = Utils.tcp("server", 3840, 30000, 30000, #(request)); \n * match ret == expected \n 'embedded expression' 中的替换失败,因为它不在 JSON 中。
    • @user2943111 圆括号内不需要嵌入表达式。请阅读:github.com/intuit/karate#enclosed-javascript
    猜你喜欢
    • 2011-04-04
    • 2011-10-11
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2019-08-23
    • 2013-07-17
    相关资源
    最近更新 更多