空手道 Java 字符串插值

Karate Java String interpolation

我正在尝试调用一个 java 方法,该方法接受一个字符串作为空手道脚本中的参数,并在该字符串中插入一个在空手道中定义的值。

在我的例子中,它是一个简单的数据库 INSERT 语句,例如:

INSERT INTO A(id, time, value) VALUES(1, '2099-05-10 18:20:18.674 UTC', 'test')

脚本本身如下所示:

Background:
    * def db = Java.type('com.example.DbTestHelper')
    * def offsetDateTime = Java.type('java.time.OffsetDateTime')
    * def zoneId = Java.type('java.time.ZoneId')

  Scenario: testScenario
    * def t = offsetDateTime.now(zoneId.of("Europe/Berlin")).plusDays(1)
    * def row = db.insertRow("INSERT INTO A(id, time, value) VALUES(123, #t, 'test')")

insertRow 方法如下所示:

    @JvmStatic
    fun insertRow(vararg strings: String) {
        jdbc.batchUpdate(*strings)
    }

我尝试了多种设置值 t 的组合,例如 #(t)、#t、"#(t)" 等。不幸的是,其中 none甚至在 java 方法被调用之前就导致了各种 java 脚本解析错误。

实现该目标的正确方法是什么?有可能吗?

首先阅读:https://github.com/karatelabs/karate#rules-for-embedded-expressions

好消息是,从 1.0 开始,空手道支持反引号内的 ES6 JS 字符串插值:

* def foo = 1
* def txt = `hello ${foo}`
* match txt == 'hello 1'

当然,字符串连接总是有效的。您只需要考虑大多数空手道语法,尤其是当您调用 Java 时 - 只不过是普通的旧 JavaScript.

* db.insertRow("INSERT INTO A(id, time, value) VALUES(123, " + t + ", 'test')")

我想你现在可以继续了。