【问题标题】:How to simulate timeout in response to a Rest request in Spring?如何模拟超时以响应 Spring 中的 Rest 请求?
【发布时间】:2020-12-19 18:08:38
【问题描述】:

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

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

【问题讨论】:

    标签: java spring spring-boot rest timeout


    【解决方案1】:

    需要睡觉来测试您的代码被认为是不好的做法。相反,您想复制您从超时收到的异常,例如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
        }
    
    }
    

    这样你就不会玩弄大拇指等待事情发生了。

    【讨论】:

    • 这是否测试服务器(Rest API)?我需要检查真实的客户端行为(因此没有实际的测试框架)。
    • 这只是一个例子。如果您说客户端超时,就您而言,这意味着在 x 时间后引发了异常。无论您的代码在哪里发生此异常,都会在您的测试中模拟该方法以立即抛出异常。
    【解决方案2】:

    睡眠是一种方法,但如果您要编写数十个这样的测试,那么必须等待睡眠将创建一个非常长时间运行的测试套件。

    另一种方法是更改​​客户端超时的“阈值”以进行测试。如果在生产中您的客户端应该等待 5 秒以等待响应,那么在测试中将其更改为 0.5 秒(假设您的服务器需要更长的时间来响应)但保持相同的错误处理逻辑。

    后者可能不适用于所有场景,但它肯定会让您免于运行需要 10 分钟以上的测试套件。

    【讨论】:

    • 好点,这就是为什么我更喜欢连接断开而不是睡眠的原因;我不喜欢更换客户,但这可能是一个有用的最后手段。
    【解决方案3】:

    你可以做一件事,就像我在我的情况下所做的那样。 实际上,就我而言,当我的应用程序在生产环境中运行时,我们会不断从 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 2013-03-23
      • 2015-06-26
      • 1970-01-01
      • 2016-04-23
      • 2018-09-11
      • 2012-08-11
      • 1970-01-01
      相关资源
      最近更新 更多