citrus-framework - 柑橘模拟器 | 提取有效载荷
问题描述
我正在尝试根据 Xpath 场景应用条件,但遗憾的是无法做出决定,因为我无法获取请求有效负载。
RQ1-
<HotelOperation>
<Head Function="Search">
</Head>
<Form>
<Search PropertyCode="Hotel1">
...
</Search>
</Form>
</HotelOperation>
RQ2-
<HotelOperation>
<Head Function="Rate">
</Head>
<Form>
<RateSearch PropertyCode="Hotel1">
...
</RateSearch>
</Form>
</HotelOperation>
RQ3-
<HotelOperation>
<Head Function="Book">
</Head>
<Form>
<Book PropertyCode="Hotel1">
...
</Book>
</Form>
</HotelOperation>
RQ4 -
<HotelOperation>
<Head Function="Cancel">
</Head>
<Form>
<Cancel PropertyCode="Hotel1">
...
</Cancel>
</Form>
</HotelOperation>
我想为每个请求检索 PropertyCode 的 Xpath 值,并且会有更多的 Xpath。
//HotelOperation/Form/Search/@PropertyCode
//HotelOperation/Form/RateSearch/@PropertyCode
//HotelOperation/Form/Book/@PropertyCode
//HotelOperation/Form/Cancel/@PropertyCode
我只创建了一个模拟器,并希望为每个请求提供响应。每个请求的响应都不同,我还需要从请求中获取值并填充到响应中。
package com.dhisco.learnings.simulator.scenario;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.xml.HasXPath.hasXPath;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.consol.citrus.context.TestContext;
import com.consol.citrus.endpoint.adapter.mapping.XPathPayloadMappingKeyExtractor;
import com.consol.citrus.message.Message;
import com.consol.citrus.simulator.scenario.AbstractSimulatorScenario;
import com.consol.citrus.simulator.scenario.Scenario;
import com.consol.citrus.simulator.scenario.ScenarioDesigner;
import com.consol.citrus.simulator.scenario.ScenarioRunner;
import com.dhisco.learnings.simulator.variables.UDOperations;
@Scenario("HotelOperationScenario")
@RequestMapping(value = "/services/rest/simulator/hoteloperation", method = RequestMethod.POST)
public class CtripUltraDirectScenario extends AbstractSimulatorScenario {
@Override
public void run(ScenarioRunner scenario) {
}
@Override
public void run(ScenarioDesigner scenario) {
scenario.correlation().start().withHandler(this);
scenario.http().receive().post().
.extractFromPayload("//HotelOperation/Form/Search/@PropertyCode", "propCode")
.extractFromPayload("//HotelOperation/Head/@Function", "operation");
scenario.conditional().when("${operation}", equalTo("Search")) .actions(scenario.http().send().response(HttpStatus.OK).contentType(MediaType.APPLICATION_XML_VALUE)
.payload("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<HotelOperation>"
+ "<Property Code=\"${propCode}\">"
+ "</Property>" + "</HotelOperation>"));
scenario.conditional().when("${operation}", equalTo("RateSearch")) .actions(scenario.http().send().response(HttpStatus.OK).contentType(MediaType.APPLICATION_XML_VALUE)
.payload("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<HotelOperation>"
+ "<Rate Code=\"${propCode}\">"
+ "</Rate>" + "</HotelOperation>"));
}
@Override
public boolean isHandlerFor(Message message, TestContext context) {
return new XPathPayloadMappingKeyExtractor().getMappingKey(message).equals("HotelOperation");
}
}
是否有可能从模拟器场景中获取请求有效负载,或者是否有办法为每个操作(搜索、评分、预订、取消)应用条件 XPath。
解决方案
public void run(ScenarioRunner scenario) {
DefaultMessageStore messageStore = (DefaultMessageStore)
scenario.getTestContext().getMessageStore();
String rqXML = (String) messageStore.getMessage("receive(<scenario name>)").getPayload();
}
推荐阅读
- java - @PersistenceContext 不适用于参数。如何通过构造函数注入 EntityManager?
- java - 在指定路径上找不到 .jks 文件
- java - java中带有双反斜杠的正则表达式
- c# - 停止上一个任务并运行新任务 wpf
- asp.net - 使用 ASP.Net 直接打印 PDF 文件
- node.js - 使用 Typescript 在 Sequelize 模型中创建实例方法
- javascript - CSharp 和 javascript 中的 FromXmlString
- vba - exel文件中的错误行
- sql-server - SQL Server:查询单个表以显示其他列
- ios - 如何将用户注册到 AWSCognitoIdentityUserPool 并取回 JWT 令牌?