如何在Spring中响应超时请求模拟超时?

问题描述

我有一个Spring Boot 2实现的Rest API。要检查超时时某些客户端行为,如何在测试环境中模拟这种情况?服务器应定期接收并处理该请求(实际上,由于网络随机变慢和较大的响应负载而导致生产超时)。

增加长时间的睡眠是否是合适的模拟技术?有没有更好的方法可以真正让服务器“丢弃”响应?

解决方法

需要睡眠来测试代码被认为是不好的做法。相反,您想复制从超时中收到的异常,例如使用java.net.SocketTimeoutExceptionRestTemplate.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轮询交易,有时它会通过抛出Exception 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 
         }
    }
}

类似地,在您的情况下,某些Exception会抛出该Exception,并将您的线程置于睡眠状态一段时间,然后再次尝试连接Connection,您可以根据需要修改retryCount,在我的情况下为5。