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

Java 如何在Spring中模拟响应Rest请求的超时?,java,spring,spring-boot,rest,timeout,Java,Spring,Spring Boot,Rest,Timeout,我有一个用SpringBoot2实现的RESTAPI。要检查超时时的一些客户端行为,我如何在测试环境中模拟这种情况?服务器应该定期接收请求并对其进行处理(事实上,由于随机网络减速和大量响应有效负载,生产中会发生超时) 增加长时间睡眠是合适的模拟技术吗?有没有更好的方法让服务器真正“删除”响应?睡眠是一种方法,但是如果您正在编写几十个这样的测试,那么等待睡眠将创建一个真正长期运行的测试套件 另一种方法是在客户端更改超时的“阈值”进行测试。如果在生产环境中,您的客户机应该等待5秒以等待响应,那么在测

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


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

睡眠是一种方法,但是如果您正在编写几十个这样的测试,那么等待睡眠将创建一个真正长期运行的测试套件

另一种方法是在客户端更改超时的“阈值”进行测试。如果在生产环境中,您的客户机应该等待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时间量之后抛出了异常。无论代码在何处发生此异常,都要在测试中模拟该方法以立即抛出异常。