如何在柑橘框架中投射从有效载荷中提取的变量?

时间:2016-10-19 09:06:36

标签: java integration-testing citrus-framework

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

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

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

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

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

但它很长,所以进行投射不起作用(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));
}

1 个答案:

答案 0 :(得分:0)

在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值。