可以使用客户端测试来测试内部使用 .这
想法是声明预期的请求并提供“存根”响应,以便您可以
专注于隔离测试代码(即,不运行服务器)。以下
示例演示如何执行此操作:RestTemplate
-
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()
在前面的示例中,(客户端 REST 的中心类
tests) 配置一个自定义
根据预期断言实际请求,并返回“存根”响应。在这个
情况下,我们期望收到请求并希望返回包含内容的 200 个响应。我们可以将其他预期请求和存根响应定义为
需要。当我们定义预期的请求和存根响应时,可以
像往常一样在客户端代码中使用。在测试结束时,可以
用于验证是否已满足所有期望。MockRestServiceServer
RestTemplate
ClientHttpRequestFactory
/greeting
text/plain
RestTemplate
mockServer.verify()
默认情况下,请求应按照声明预期的顺序进行。你
可以在构建服务器时设置选项,在这种情况下,所有
检查期望(按顺序)以找到给定请求的匹配项。这意味着
允许以任何顺序提出请求。以下示例使用:ignoreExpectOrder
ignoreExpectOrder
-
Java
-
Kotlin
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
即使默认情况下无序请求,每个请求也只允许运行一次。
该方法提供了一个重载变体,该变体接受指定计数范围的参数(例如,、、、、、等)。以下示例使用:expect
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()
请注意,未设置 when(默认值),因此,请求
是按声明顺序预期的,则该顺序仅适用于任何顺序中的第一个
预期的请求。例如,如果“/something”预期两次,后跟
“/somewhere”三次,那么在有
对“/某处”的请求,但是,除了随后的“/某物”和“/某处”之外,
请求可以随时提出。ignoreExpectOrder
作为上述所有方法的替代方法,客户端测试支持还提供了一个实现,您可以将其配置为
将其绑定到实例。这允许使用实际的服务器端处理请求
逻辑,但不运行服务器。以下示例演示如何执行此操作:ClientHttpRequestFactory
RestTemplate
MockMvc
-
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()
在前面的示例中,我们创建了 using the from the before replaces
它与另一个嘲笑响应的人不同。
然后,我们用两种响应来定义期望:ExecutingResponseCreator
ClientHttpRequestFactory
RestTemplate
MockRestServiceServer
-
终结点的存根响应(不会执行任何实际请求)
200
/profile
-
通过调用终结点获得的响应
/quoteOfTheDay
在第二种情况下,请求是通过
较早捕获。这会生成一个响应,例如来自实际的远程服务器,
取决于最初的配置方式。ClientHttpRequestFactory
RestTemplate
静态导入
与服务器端测试一样,用于客户端测试的 Fluent API 需要一些静态
进口。通过搜索 .Eclipse 用户应将 和 添加为
“喜欢的静态成员”,在 Java → Editor → Content 下的 Eclipse 首选项中
协助→收藏夹。这允许在键入第一个字符后使用内容助手
静态方法名称。其他 IDE(如 IntelliJ)可能不需要任何其他
配置。检查对静态成员的代码补全支持。MockRest*
MockRestRequestMatchers.*
MockRestResponseCreators.*
客户端 REST 测试的更多示例
Spring MVC Test 自己的测试包括示例 客户端 REST 测试的测试。