Spring 引导 API 在生产中模拟
Spring Boot API Mocking In Production
我知道,我们可以在 Spring-Boot.在这里,我想尝试在 Spring Boot 中创建一个演示产品 scope/profile。在这个配置文件中,我想使用模拟场景。
例如,在我的代码中,有第三方 API 调用:
String API_URL = "https://external.com/v1/%s";
private CloseableHttpClient httpClient;
public Result executeRequest(String apiVersion, String subUrl, HttpMethod httpMethod)
{
try
{
HttpRequestBase httpRequest;
String url = String.format(API_URL, subUrl);
if (httpMethod.equals(HttpMethod.GET))
{
httpRequest = new HttpGet(url);
}
else if (httpMethod.equals(HttpMethod.POST))
{
httpRequest = new HttpPost(url);
((HttpPost) httpRequest).setEntity(new StringEntity(requestBody, "UTF-8"));
}
...
headers.forEach(httpRequest::setHeader);
HttpResponse response = httpClient.execute(httpRequest);
}
catch (IOException e)
{
logger.error("IO Error: {}", e.getMessage());
return handleExceptions(e);
}
}
有没有办法在生产中模拟它?或者更好的方法;有没有办法为它创建嵌入式服务器(wiremock)?
注意:我已经在我的项目(生产、测试和开发)中实现了不同的配置文件属性,因此这与使用不同的配置文件无关。在这里,我只想在生产中模拟 API 而不是在测试配置文件中。当然,对于演示配置文件,我将创建 demo.properties
解决方案一:
可以通过以下配置实现该行为
@Configuration
@Profile("!demo")
public class ProductionConfiguration {
// Real configuration
}
@Configuration
@Profile("demo")
public class ProductionConfiguration {
// Mock configuration
}
由于 @MockBean
注释是 spring 测试依赖项的一部分,因此在部署应用程序时它不可用。您需要自己创建模拟 Type mockObj = Mockito.mock(Type.class)
但这需要将 mockito
依赖项打包为生成的工件的一部分。
方案二:(推荐)
- 将 API URL 外部化到属性文件。
- 创建一个单独的属性文件
application-demo.properties
用于演示目的
- 更新此属性文件中的 URLs 以连接到外部
WireMock
服务
这可确保您的生产工件不需要包含仅用于演示目的的不必要依赖项。
如果需要,您可以选择在 demo
配置文件处于活动状态时启动嵌入式 WireMock
服务器。但这意味着相关依赖项必须是您的依赖项的一部分,或者在类路径中可用。如果可能,最好 运行 WireMock 作为外部服务。
解决方案 2 的示例代码可用here供您参考。
我知道,我们可以在 Spring-Boot.在这里,我想尝试在 Spring Boot 中创建一个演示产品 scope/profile。在这个配置文件中,我想使用模拟场景。
例如,在我的代码中,有第三方 API 调用:
String API_URL = "https://external.com/v1/%s";
private CloseableHttpClient httpClient;
public Result executeRequest(String apiVersion, String subUrl, HttpMethod httpMethod)
{
try
{
HttpRequestBase httpRequest;
String url = String.format(API_URL, subUrl);
if (httpMethod.equals(HttpMethod.GET))
{
httpRequest = new HttpGet(url);
}
else if (httpMethod.equals(HttpMethod.POST))
{
httpRequest = new HttpPost(url);
((HttpPost) httpRequest).setEntity(new StringEntity(requestBody, "UTF-8"));
}
...
headers.forEach(httpRequest::setHeader);
HttpResponse response = httpClient.execute(httpRequest);
}
catch (IOException e)
{
logger.error("IO Error: {}", e.getMessage());
return handleExceptions(e);
}
}
有没有办法在生产中模拟它?或者更好的方法;有没有办法为它创建嵌入式服务器(wiremock)?
注意:我已经在我的项目(生产、测试和开发)中实现了不同的配置文件属性,因此这与使用不同的配置文件无关。在这里,我只想在生产中模拟 API 而不是在测试配置文件中。当然,对于演示配置文件,我将创建 demo.properties
解决方案一:
可以通过以下配置实现该行为
@Configuration
@Profile("!demo")
public class ProductionConfiguration {
// Real configuration
}
@Configuration
@Profile("demo")
public class ProductionConfiguration {
// Mock configuration
}
由于 @MockBean
注释是 spring 测试依赖项的一部分,因此在部署应用程序时它不可用。您需要自己创建模拟 Type mockObj = Mockito.mock(Type.class)
但这需要将 mockito
依赖项打包为生成的工件的一部分。
方案二:(推荐)
- 将 API URL 外部化到属性文件。
- 创建一个单独的属性文件
application-demo.properties
用于演示目的 - 更新此属性文件中的 URLs 以连接到外部
WireMock
服务
这可确保您的生产工件不需要包含仅用于演示目的的不必要依赖项。
如果需要,您可以选择在 demo
配置文件处于活动状态时启动嵌入式 WireMock
服务器。但这意味着相关依赖项必须是您的依赖项的一部分,或者在类路径中可用。如果可能,最好 运行 WireMock 作为外部服务。
解决方案 2 的示例代码可用here供您参考。