【发布时间】:2020-12-19 18:08:38
【问题描述】:
我有一个使用 Spring Boot 2 实现的 Rest API。要检查超时时的某些客户端行为,我如何在我的测试环境中模拟这种情况?服务器应该定期接收请求并对其进行处理(事实上,由于随机的网络速度变慢和大的响应负载过大,在生产环境中会发生超时)。
添加长时间睡眠是否是合适的模拟技术?有没有更好的方法让服务器真正“丢弃”响应?
【问题讨论】:
标签: java spring spring-boot rest timeout
我有一个使用 Spring Boot 2 实现的 Rest API。要检查超时时的某些客户端行为,我如何在我的测试环境中模拟这种情况?服务器应该定期接收请求并对其进行处理(事实上,由于随机的网络速度变慢和大的响应负载过大,在生产环境中会发生超时)。
添加长时间睡眠是否是合适的模拟技术?有没有更好的方法让服务器真正“丢弃”响应?
【问题讨论】:
标签: java spring spring-boot rest timeout
需要睡觉来测试您的代码被认为是不好的做法。相反,您想复制您从超时收到的异常,例如java.net.SocketTimeoutException 使用 RestTemplate.exchange 时。
然后你可以这样写一个测试:
public class FooTest
@Mock
RestTemplate restTemplate;
@Before
public void setup(){
when(restTemplate.exchange(...)).thenThrow(new java.net.SocketTimeoutException())
}
@Test
public void test(){
// TODO
}
}
这样你就不会玩弄大拇指等待事情发生了。
【讨论】:
睡眠是一种方法,但如果您要编写数十个这样的测试,那么必须等待睡眠将创建一个非常长时间运行的测试套件。
另一种方法是更改客户端超时的“阈值”以进行测试。如果在生产中您的客户端应该等待 5 秒以等待响应,那么在测试中将其更改为 0.5 秒(假设您的服务器需要更长的时间来响应)但保持相同的错误处理逻辑。
后者可能不适用于所有场景,但它肯定会让您免于运行需要 10 分钟以上的测试套件。
【讨论】:
你可以做一件事,就像我在我的情况下所做的那样。 实际上,就我而言,当我的应用程序在生产环境中运行时,我们会不断从 API 轮询交易,有时它会通过抛出异常 SSLProtocolException 来断开连接。
我们做了什么
int retryCount =5;
while (true ){
count++;
try{
//send an api request here
}catch (Exception e){
if(retryCount == count ) {
throw e
// here we can do a thread sleep. and try after that period to reconnect
}
}
}
类似地,在您的情况下,一些异常它会抛出捕获该异常并将您的线程置于睡眠状态一段时间,然后再次尝试连接,您可以根据您的要求修改 retryCount,在我的情况下它是 5。
【讨论】: