Java中的Hoverfly简介

2023/05/09

1. 概述

在本文中,我们将介绍HoverflyJava库-它提供了一种创建真实API存根/模拟的简单方法。

2. Maven依赖

要使用Hoverfly,我们需要添加一个Maven依赖项:

<dependency>
    <groupId>io.specto</groupId>
    <artifactId>hoverfly-java</artifactId>
    <version>0.8.1</version>
</dependency>

最新版本可以在这里找到。

3. 模拟API

首先,我们将Hoverfly配置为在模拟模式下运行。定义模拟的最简单方法是使用DSL

让我们从一个简单的例子开始,通过实例化HoverflyRule实例:

public static final HoverflyRule rule = HoverflyRule.inSimulationMode(dsl(
    service("http://www.tuyucheng.com")
        .get("/api/courses/1")
        .willReturn(success().body(jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))));

SimulationSource类提供了一个用于启动API定义的dsl方法。此外,Hoverfly DSL的service方法允许我们定义端点和相关的请求路径。

然后我们调用willReturn来说明我们想要得到哪个响应作为回报。我们还使用了ResponseBuilder的success方法来设置响应状态和正文。

4. 使用JUnit进行测试

使用JUnit可以轻松测试Stubbed API。

让我们创建一个发送HTTP请求的简单测试,看看它是否到达端点:

responseEntity<String> courseResponse = restTemplate.getForEntity("http://www.baeldung.com/api/courses/1", String.class);
 
assertEquals(HttpStatus.OK, courseResponse.getStatusCode());
assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody());

我们使用Spring Web模块的RestTemplate类实例来发送HTTP请求。

5. 添加延迟

可以为特定的HTTP方法或特定的API调用全局添加延迟

以下是使用POST方法设置请求延迟的示例代码:

SimulationSource.dsl(service("http://www.tuyucheng.com")
    .post("/api/courses")
    .willReturn(success())
    .andDelay(3, TimeUnit.SECONDS)
    .forMethod("POST")
)

6. 请求匹配器

HoverflyMatchers工厂类提供了多个匹配器,包括用于URL的exactMatch和globMatch。

对于HTTP主体,它提供JSON/XML精确匹配和JSONPath/XPath匹配。

默认情况下,exactMatch匹配器用于URL和正文匹配。

以下是使用不同匹配器的示例:

SimulationSource.dsl(service(matches("www.*dung.com"))
    .get(startsWith("/api/student")) 
    .queryParam("page", any()) 
    .willReturn(success())
 
    .post(equalsTo("/api/student"))
    .body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}")))
    .willReturn(success())
 
    .put("/api/student/1")
    .body(matchesJsonPath("$.name")) 
    .willReturn(success())
 
    .post("/api/student")
    .body(equalsToXml("<student><id>2</id><name>John</name></student>"))
    .willReturn(success())
 
    .put("/api/student/2")
    .body(matchesXPath("/student/name")) 
    .willReturn(success()));
)

在此示例中,matches方法使用允许通配符搜索的globMatch检查URL。

然后startsWith检查请求路径是否以“/api/student”开头。我们使用任何匹配器来允许页面查询参数中的所有可能值。

equalsToJson匹配器确保正文有效负载与此处给出的确切JSON匹配。matchesJsonPath方法用于检查特定JSON路径中的元素的是否存在。

同样,equalsToXml将请求正文中给出的XML与此处给出的XML匹配。matchesXPath将正文与XPath表达式匹配。

7. 总结

在这个快速教程中,我们讨论了Hoverfly Java库的使用。我们研究了模拟HTTP服务、用于配置端点的DSL、添加延迟和使用请求匹配器。我们还研究了使用JUnit测试这些服务。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章