暂时将域解析为 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.properties
在 src/test/resources
下。此文件将包含 api.host=localhost
而生产 application.properties
包含 api.host=api.example.com
.
您用 @ActiveProfiles("integration-testing")
注释您的测试,瞧,api.host
值将是 localhost
但仅用于测试。
解决方案 2:自定义 DNS 解析器
使用默认实现 (HttpURLConnection) 似乎不可能有自定义解析器。您可以将 RestTemplate
与 ClientHttpRequestFactory which allows a custom DNS resolver eg. the Apache HttpClient HttpComponentsClientHttpRequestFactory, see this answer 的实现一起使用以获得更多详细信息。
解决方案 3:Mock Rest 模板
您可以通过 MockRestServiceServer 使用 RestTemplate
模拟。此解决方案不涉及真正的 http 服务器。
我想说的是,您可以使用 MockServer,并使用 RestAssured 框架,通过它您可以跟踪调用并重定向到模拟服务器。
使用 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.properties
在 src/test/resources
下。此文件将包含 api.host=localhost
而生产 application.properties
包含 api.host=api.example.com
.
您用 @ActiveProfiles("integration-testing")
注释您的测试,瞧,api.host
值将是 localhost
但仅用于测试。
解决方案 2:自定义 DNS 解析器
使用默认实现 (HttpURLConnection) 似乎不可能有自定义解析器。您可以将 RestTemplate
与 ClientHttpRequestFactory which allows a custom DNS resolver eg. the Apache HttpClient HttpComponentsClientHttpRequestFactory, see this answer 的实现一起使用以获得更多详细信息。
解决方案 3:Mock Rest 模板
您可以通过 MockRestServiceServer 使用 RestTemplate
模拟。此解决方案不涉及真正的 http 服务器。
我想说的是,您可以使用 MockServer,并使用 RestAssured 框架,通过它您可以跟踪调用并重定向到模拟服务器。