以前,我们使用过一些现有的Hoverfly匹配器,例如regex,glob和精确。每个人都有其目的,但是我们可能需要一些规则来帮助我们通过请求交换数据的格式。
在此博客上,我们将重点介绍xml的匹配器。
默认的xml匹配器会将提交的xml与预期的xml进行比较。 这意味着应逐个节点逐个值地验证提交的xml。 只要换行符或其他多余的空格不改变xml携带的内容,就不会阻止请求成功。
让我们放置将使xml匹配的初始配置。
public static final String SUCCESS_RESPONSE = "<response>"
+ "<result>success</result>"
+ "</response>";
private Hoverfly hoverfly;
@BeforeEach
void setUp() {
var simulation = SimulationSource.dsl(service("http://localhost:8085")
.post("/xml")
.body(RequestFieldMatcher.newXmlMatcher("<document type=\"xml\">"
+ "xml-request"
+ "</document>"))
.willReturn(success(SUCCESS_RESPONSE, "application/xml")));
var localConfig = HoverflyConfig.localConfigs().disableTlsVerification().asWebServer().proxyPort(8085);
hoverfly = new Hoverfly(localConfig, SIMULATE);
hoverfly.start();
hoverfly.simulate(simulation);
}
@AfterEach
void tearDown() {
hoverfly.close();
}
因此,在第一个示例中,我们将尝试将请求的xml与预期的xml进行匹配。
@Test
void testXmlExactMatch() {
var client = HttpClient.newHttpClient();
var exactRequest = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8085/xml"))
.POST(HttpRequest.BodyPublishers.ofString(" <document type=\"xml\">\n\n"
+ "xml-request"
+ "</document>\t"))
.build();
var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.join();
Assertions.assertEquals(SUCCESS_RESPONSE, exactResponse);
}
如您所见,无论新行和选项卡如何,由于xml数据均匹配,所以我们的请求将成功。
现在,让我们尝试将节点添加到xml中。
@Test
void testXmlNoMatch() {
var client = HttpClient.newHttpClient();
var exactRequest = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8085/xml"))
.POST(HttpRequest.BodyPublishers.ofString(" <document type=\"xml\">\n\n"
+ "xml-request"
+ "</document>\t<empty-node>ok</empty-node>"))
.build();
var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
.join();
Assertions.assertEquals(502, exactResponse.statusCode());
}
xml不匹配,因此将失败。
让我们关注另一个问题。 由于交换的数据是动态的,因此可能无法实现完全匹配。 另外,您可能不必只关注提交的所有信息,而只关注交换信息的特定部分。 因此,XPath匹配器变得很方便。
将使用XPath规则增强初始设置。
@BeforeEach
void setUp() {
var simulation = SimulationSource.dsl(service("http://localhost:8085")
.post("/xml")
.body(RequestFieldMatcher.newXmlMatcher("<document type=\"xml\">"
+ "xml-request"
+ "</document>"))
.willReturn(success(SUCCESS_RESPONSE, "application/xml"))
.post("/xpath")
.body(RequestFieldMatcher.newXpathMatcher("/document/payment[amount=1]"))
.willReturn(success(SUCCESS_RESPONSE, "application/xml"))
);
var localConfig = HoverflyConfig.localConfigs().disableTlsVerification().asWebServer().proxyPort(8085);
hoverfly = new Hoverfly(localConfig, SIMULATE);
hoverfly.start();
hoverfly.simulate(simulation);
}
如果存在带有付款节点的单据节点,并且金额节点上的值是1,则将存在一个匹配项让我们去一个积极的情况
@Test
void testXpathMatch() {
var client = HttpClient.newHttpClient();
var exactRequest = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8085/xpath"))
.POST(HttpRequest.BodyPublishers.ofString(" <document type=\"xml\">\n\n"
+ "<payment><amount>142</amount></payment>"
+ "<payment><amount>1</amount><currency>GBP</currency></payment>"
+ "<payment>invalid</payment>"
+ "</document>\t"))
.build();
var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.join();
Assertions.assertEquals(SUCCESS_RESPONSE, exactResponse);
}
正如预期的那样,我们进行了比赛。让我们去消极的情况。
@Test
void testXpathNoMatch() {
var client = HttpClient.newHttpClient();
var exactRequest = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8085/xpath"))
.POST(HttpRequest.BodyPublishers.ofString(" <document type=\"xml\">\n\n"
+ "<payment><amount>142</amount></payment>"
+ "<payment><amount>no-match</amount><currency>GBP</currency></payment>"
+ "<payment>invalid</payment>"
+ "</document>\t"))
.build();
var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
.join();
Assertions.assertEquals(502, exactResponse.statusCode());
}
就是这样,我们确实对基于xml的数据使用了xml和xpath匹配器。 下一个博客将重点介绍基于JSON的匹配器。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34140.html