gpt4 book ai didi

java - 如何模拟带有客户端或服务器错误的 RestTemplate?

转载 作者:行者123 更新时间:2023-12-02 02:40:19 26 4
gpt4 key购买 nike

我正在使用restTemplate.postForEntity()在我的代码中。在测试围绕它的类时,我使用 Mockito 来模拟 RestTemplate。

Mockito.when(restTemplate.postForEntity(.....)).thenReturn(response)

其中响应​​是:

ResponseEntity<String> response = new ResponseEntity(HttpStatus.UNAUTHORIZED);

现在,当我运行此测试时,postForEntity返回我刚刚显示的模拟响应。然而,在实际执行中,RestTemplate 会抛出 RestClientException当它收到401时从 Remote 。

在幕后,这是因为 doExecute()RestTemplate检查错误并在出现 4XX 和 5XX 错误时抛出此异常。

我当然可以重写模拟规则:

Mockito.when(restTemplate.postForEntity(.....)).thenThrow(new RestClientException(..)) .

但是在阅读测试时,这不是很直观:我希望它本身响应 401 或 500。

我应该怎么做才能实现这个目标?

最佳答案

您已经在问题中说过了:您正在 mock RestTemplate 并测试使用它的类。你不是在 mock ,只是在 mock 。

如果您希望 RestTemplate 根据其接收到的 http 状态抛出该异常,那么您需要模拟 RestTemplate 使用的内部客户端,并使其在调用时返回该状态代码。然后你的 RestTemplate 应该被 stub (或使用真正的实现)来对该 http 状态使用react。

但在我看来这不是你想要测试的。

如果您仅谈论测试的可读性(但继续测试您正在测试的内容),那么我建议创建一个基于 http 状态生成模拟答案的方法。如果状态不是 200 那么答案应该抛出异常。

因此,在您的 Resttemplate 模拟中,您将拥有:

when(restTemplate.postForEntity(...))
.thenAnswer(answer(401));

并回答类似的实现:

private Answer answer(int httpStatus) {
return (invocation) -> {
if (httpStatus >= 400) {
throw new RestClientException(...);
}
return <whatever>;
};
}

这只是一个示例,您需要适应您的具体需求。

关于java - 如何模拟带有客户端或服务器错误的 RestTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45597079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com