暂时将域解析为 localhost 以便在 Spring 中进行测试

Temporarily resolve domain to localhost for testing in Spring

使用 spring 启动我构建了一个向外部远程服务发出 HTTP 请求的应用程序。为了进行测试,我想模拟这个外部服务而不是调用真实服务。当 运行 完整的端到端测试时,代码仍然执行 HTTP 请求,但我希望它调用我的模拟服务器(我可以在其中检查调用是否正确)。

假设调用的是 api.example.com。我可以使用 Java / Spring / JBehave 以编程方式临时添加一行到主机文件或 JVM 中的等效行为,以便 api.example.com 解析为 localhost 吗?

解决方案 1:Spring 配置文件

假设 api.example.com 在您的 spring application.properties 中定义,最常见的行为是使用与 spring个人资料。

例如假设 api.example.com 关联到 属性 api.host 键,您可以创建一个 spring 配置文件 integration-testing 及其关联的应用程序属性文件application-integration-testing.propertiessrc/test/resources 下。此文件将包含 api.host=localhost 而生产 application.properties 包含 api.host=api.example.com.

您用 @ActiveProfiles("integration-testing") 注释您的测试,瞧,api.host 值将是 localhost 但仅用于测试。

解决方案 2:自定义 DNS 解析器

使用默认实现 (HttpURLConnection) 似乎不可能有自定义解析器。您可以将 RestTemplateClientHttpRequestFactory which allows a custom DNS resolver eg. the Apache HttpClient HttpComponentsClientHttpRequestFactory, see this answer 的实现一起使用以获得更多详细信息。

解决方案 3:Mock Rest 模板

您可以通过 MockRestServiceServer 使用 RestTemplate 模拟。此解决方案不涉及真正的 http 服务器。

我想说的是,您可以使用 MockServer,并使用 RestAssured 框架,通过它您可以跟踪调用并重定向到模拟服务器。