此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
测试客户端应用程序
您可以使用客户端测试来测试内部使用RestTemplate
.这
这个想法是声明预期的请求并提供 “stub” 响应,以便您可以
专注于隔离测试代码 (即,不运行服务器) 。以下内容
示例展示了如何做到这一点:
-
Java
-
Kotlin
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess());
// Test code that uses the above RestTemplate ...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess())
// Test code that uses the above RestTemplate ...
mockServer.verify()
在前面的示例中,MockRestServiceServer
(客户端 REST 的中心类
tests) 配置RestTemplate
使用自定义ClientHttpRequestFactory
那
根据预期断言实际请求并返回 “stub” 响应。在这个
case 中,我们希望请求/greeting
并希望返回 200 响应text/plain
内容。我们可以将其他预期请求和存根响应定义为
需要。当我们定义预期的请求和存根响应时,RestTemplate
可以是
像往常一样在客户端代码中使用。在测试结束时,mockServer.verify()
可以是
用于验证是否已满足所有期望。
默认情况下,请求应按照声明 expectations 的顺序进行。你
可以设置ignoreExpectOrder
选项,在这种情况下,所有
检查 expectations 以查找给定请求的匹配项。这意味着
请求可以按任何顺序出现。以下示例使用ignoreExpectOrder
:
-
Java
-
Kotlin
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
即使默认情况下使用无序请求,每个请求也只允许运行一次。
这expect
method 提供了一个重载的变体,该变体接受ExpectedCount
指定计数范围的参数(例如once
,manyTimes
,max
,min
,between
等)。以下示例使用times
:
-
Java
-
Kotlin
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess());
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess());
// ...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess())
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess())
// ...
mockServer.verify()
请注意,当ignoreExpectOrder
未设置(默认值),因此,请求
应按声明顺序排列,则该顺序仅适用于任何
预期请求。例如,如果 “/something” 需要两次,后跟
“/somewhere”三次,那么在出现之前应该有一个对 “/something” 的请求
对 “/somewhere” 的请求,但是,除了后面的 “/something” 和 “/somewhere” 之外,
请求可能随时出现。
作为上述所有方法的替代方案,客户端测试支持还提供了一个ClientHttpRequestFactory
实现,您可以将其配置为RestTemplate
自
将其绑定到MockMvc
实例。这允许使用实际的服务器端处理请求
logic 的 logic,但没有运行 server。以下示例显示了如何执行此作:
-
Java
-
Kotlin
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));
// Test code that uses the above RestTemplate ...
val mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()
restTemplate = RestTemplate(MockMvcClientHttpRequestFactory(mockMvc))
// Test code that uses the above RestTemplate ...
在某些情况下,可能需要改为执行对远程服务的实际调用
嘲笑回应。以下示例显示了如何通过ExecutingResponseCreator
:
-
Java
-
Kotlin
RestTemplate restTemplate = new RestTemplate();
// Create ExecutingResponseCreator with the original request factory
ExecutingResponseCreator withActualResponse = new ExecutingResponseCreator(restTemplate.getRequestFactory());
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/profile")).andRespond(withSuccess());
mockServer.expect(requestTo("/quoteOfTheDay")).andRespond(withActualResponse);
// Test code that uses the above RestTemplate ...
mockServer.verify();
val restTemplate = RestTemplate()
// Create ExecutingResponseCreator with the original request factory
val withActualResponse = new ExecutingResponseCreator(restTemplate.getRequestFactory())
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(requestTo("/profile")).andRespond(withSuccess())
mockServer.expect(requestTo("/quoteOfTheDay")).andRespond(withActualResponse)
// Test code that uses the above RestTemplate ...
mockServer.verify()
在前面的示例中,我们创建了ExecutingResponseCreator
使用ClientHttpRequestFactory
从RestTemplate
以前 MockRestServiceServer
取代
它与另一个模拟响应的 it 一起使用。
然后,我们用两种响应来定义期望:
-
存根
200
response 的/profile
endpoint(不会执行实际请求) -
通过调用
/quoteOfTheDay
端点
在第二种情况下,请求通过ClientHttpRequestFactory
那是
早些时候捕获。这会生成一个响应,例如,该响应可能来自实际的远程服务器
取决于RestTemplate
最初配置。
静态导入
与服务器端测试一样,用于客户端测试的 Fluent API 需要一些静态
进口。这些很容易通过搜索找到MockRest*
.Eclipse 用户应添加MockRestRequestMatchers.*
和MockRestResponseCreators.*
如
“→→ Content Editor”下的 Eclipse 首选项中的 “favorite static members”
协助 → 收藏夹。这允许在键入
静态方法名称。其他 IDE(如 IntelliJ)可能不需要任何其他
配置。检查静态成员是否支持代码完成。
客户端 REST 测试的更多示例
Spring MVC Test 自己的测试包括示例 客户端 REST 测试的测试。