Contents

Hoverfly 简介

1. 概述

在本文中,我们将了解Hoverfly Java 库——它提供了一种创建真实 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.blogdemo.com")
      .get("/api/courses/1")
      .willReturn(success().body(
        jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))));

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

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

4. 使用JUnit进行测试

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

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

responseEntity<String> courseResponse
  = restTemplate.getForEntity("http://www.blogdemo.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.blogdemo.com")
    .post("/api/courses")
    .willReturn(success())
    .andDelay(3, TimeUnit.SECONDS)
    .forMethod("POST")
)

6. 请求匹配器

HoverflyMatchers工厂类提供了几个匹配器,包括URL 的exactMatchglobMatch。对于它提供的 HTTP 正文。

对于 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 ”开头。我们使用any匹配器来允许页面查询参数中的所有可能值。

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

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