如何转换从柑橘框架中的有效载荷中提取的变量?

How to cast a variable extracted from a payload in citrus framework?

我正在使用 Citrus Framework 创建 IT 测试。我对服务器有两次调用,一次用于创建用户,另一次用于对该用户执行某些操作。

问题:我需要来自创建用户请求的不是字符串的值,以将其放入第二次调用的请求中。提取值:

new SoapActionBuilder()
         .client(webServiceClient)
         .receive()
         .namespace("ns", MY_NAMESPACE)
         .extractFromPayload("//ns:someId", "someId")

然后这个 someId 必须用于构建下一个请求。如果它是一个字符串,它将是:

request.setSomeId("${someId}");

但它是一个 Long,所以进行转换不起作用(Citrus 稍后解析该值,并在那一刻执行 Long#valueOf):

request.setSomeId(Long.valueOf("${someId}"));

有什么方法可以轻松转换该变量(可能在提取时)?

我设法用 JavaAction 做到了,但是经常使用它很奇怪(需要 3 行和一个新方法)。它是这样的:

public void test() {
    ...
    action(new JavaActionBuilder(new JavaAction().setInstance(this))
            .method("setSomeId")
            .methodArgs(request, "${someId}"));

    ...
}
public void setSomeId(Request request, String someId) {
    request.setSomeId(Long.valueOf(someId));
}

在 TestDesigner 中访问测试变量对象的最佳方法是在测试操作中这样做。 Citrus 测试设计人员有一个设计时间,用于构建完整的测试用例。稍后在运行时执行测试并将您的 XPath 表达式计算为测试变量。所以你可以像这样添加一个新的测试动作:

action(new AbstractTestAction() {
    @Override
    public void doExecute(TestContext context) {
        Long someId = Long.valueOf(context.getVariable("someId"));
        // do something with someId
    }
}

与此相反,您可以使用没有单独设计时间的 Citrus TestRunner。但是,您必须访问 Citrus TestContext 才能将变量读取为 long 值。