对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

测试客户端应用程序

你可以用客户端测试来测试内部使用Rest模板.这 想法是声明预期请求并提供“存根”回复,这样你就能 专注于单独测试代码(即不运行服务器)。如下 示例展示了如何实现:spring-doc.cadn.net.cn

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 的核心类 测试)配置Rest模板有个习俗ClientHttpRequestFactory那 提出实际请求,违背预期,并返回“存根”回复。在这方面 我们期待收到请求/问候并想回复一个200分的回复文本/纯文字内容。我们可以定义额外预期请求和存根响应为 需要。当我们定义预期请求和存根响应时,Rest模板可以是 客户端代码中通常使用。测试结束时,mockServer.verify()可以是 用来验证所有期望都已满足。spring-doc.cadn.net.cn

默认情况下,请求会按照预期的顺序进行。你 可以设置忽略期待订单在构建服务器时,选择了所有 按顺序检查期望值,以找到匹配的请求。那就是说 请求可以按任意顺序提交。以下示例使用忽略期待订单:spring-doc.cadn.net.cn

server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()

即使是无序请求,默认情况下每个请求也只能运行一次。 这期望方法提供一个超载变体,接受预期计数该参数指定了一个计数范围(例如,一次,多次,麦克斯,,之间,依此类推)。以下示例使用:spring-doc.cadn.net.cn

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()

注意,当忽略期待订单不是设置(默认),因此请求 期望按声明顺序排列,则该顺序仅适用于任意的第一个 预期中的请求。例如,如果“/某物”被期望出现两次,随后是 “/somewhere”三次,那么在有 请求“某处”,但除了后续的“/某物”和“某处”, 请求可以随时提交。spring-doc.cadn.net.cn

作为上述所有选项的替代方案,客户端测试支持还提供ClientHttpRequestFactory你可以配置成Rest模板自 将其绑定到莫克麦克实例。这允许使用实际的服务器端处理请求 逻辑上没有运行服务器。以下示例展示了如何实现:spring-doc.cadn.net.cn

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 ...

在某些情况下,可能需要实际调用远程服务 嘲笑回应。以下示例展示了如何通过执行响应创造者:spring-doc.cadn.net.cn

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()

在前面的例子中,我们创建执行响应创造者使用ClientHttpRequestFactory来自Rest模板 以前 MockRestServiceServer取代 还有另一种嘲讽回应的视频。 然后我们定义了两种反应的期望:spring-doc.cadn.net.cn

在第二种情况下,请求通过ClientHttpRequestFactory那是 之前被捕获。这会产生一个响应,例如可能来自实际的远程服务器, 具体情况不同Rest模板最初配置的。spring-doc.cadn.net.cn

静态导入

与服务器端测试类似,客户端测试的 fluent API 需要一些静态配置 进口。这些很容易通过搜索找到模拟休息*.Eclipse用户应添加补充模拟休息请求匹配者。*模拟休息回应创作者。*如 在 Java → 编辑器内容中,Eclipse 偏好设置中的“收藏静态成员”中 → 支持→喜欢的。这允许在输入第一个字符后使用内容辅助 静态方法名称。其他IDE(如IntelliJ)可能不需要额外的需求 配置。检查静态成员是否支持代码补全。spring-doc.cadn.net.cn

客户端REST测试的进一步示例

Spring MVC 测试自有的测试示例 客户端REST测试的测试。spring-doc.cadn.net.cn