在我的应用程序中,我有外部第三方 API 请求。我想通过模拟这个 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);
}
}
总结服务类,请求可以是get、post、delete、put。并且此请求将使用标头或正文部分进行处理。然后将作为http请求处理。
我的测试课:
@SpringBootTest
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
public class ServiceTest
{
private static final String API_URL = "https://external.com/v1";
@Autowired
private Service service;
@Autowired
private RestTemplate restTemplate;
private MockRestServiceServer mockServer;
@Before
public void init()
{
mockServer = MockRestServiceServer.createServer(restTemplate);
}
@Test
public void getResult_successfully()
{
Result result = new Result();
mockServer.expect(ExpectedCount.once(),
requestTo("/subUrl"))
.andExpect(method(HttpMethod.GET))
.andRespond(withStatus(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(gson.toJson(result))
);
Result returnResult = service.executeRequest("/subUrl", GET);
mockServer.verify();
assertThat(returnResult).isEqualTo(result);
}
}
当我像上面那样实现它时,模拟不起作用。有什么建议吗?
我在这里知道,MockRestServiceServer 仅适用于 restTemplate 请求,但我想知道有没有办法用 httpClient 处理它?
注意:我希望代码片段足以整体理解代码。