Java 如何在Spring中模拟响应Rest请求的超时?
我有一个用SpringBoot2实现的RESTAPI。要检查超时时的一些客户端行为,我如何在测试环境中模拟这种情况?服务器应该定期接收请求并对其进行处理(事实上,由于随机网络减速和大量响应有效负载,生产中会发生超时)Java 如何在Spring中模拟响应Rest请求的超时?,java,spring,spring-boot,rest,timeout,Java,Spring,Spring Boot,Rest,Timeout,我有一个用SpringBoot2实现的RESTAPI。要检查超时时的一些客户端行为,我如何在测试环境中模拟这种情况?服务器应该定期接收请求并对其进行处理(事实上,由于随机网络减速和大量响应有效负载,生产中会发生超时) 增加长时间睡眠是合适的模拟技术吗?有没有更好的方法让服务器真正“删除”响应?睡眠是一种方法,但是如果您正在编写几十个这样的测试,那么等待睡眠将创建一个真正长期运行的测试套件 另一种方法是在客户端更改超时的“阈值”进行测试。如果在生产环境中,您的客户机应该等待5秒以等待响应,那么在测
增加长时间睡眠是合适的模拟技术吗?有没有更好的方法让服务器真正“删除”响应?睡眠是一种方法,但是如果您正在编写几十个这样的测试,那么等待睡眠将创建一个真正长期运行的测试套件 另一种方法是在客户端更改超时的“阈值”进行测试。如果在生产环境中,您的客户机应该等待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。需要睡眠来测试代码被认为是不好的做法。相反,您希望复制从超时接收到的异常,例如使用
restemplate.exchange
时的java.net.SocketTimeoutException
然后您可以编写这样的测试:
public class FooTest
@Mock
RestTemplate restTemplate;
@Before
public void setup(){
when(restTemplate.exchange(...)).thenThrow(new java.net.SocketTimeoutException())
}
@Test
public void test(){
// TODO
}
}
这样你就不会在等待什么事情发生时无所事事了。说得好,这就是为什么我宁愿放弃连接,也不愿睡觉;我不喜欢改变客户端,但这可能是一个有用的最后手段。这是否测试服务器(RESTAPI)?我需要检查真实的客户端行为(因此没有实际的测试框架)。如果您说客户端超时,就您而言,这意味着在x时间量之后抛出了异常。无论代码在何处发生此异常,都要在测试中模拟该方法以立即抛出异常。