如何在Java集成测试中模拟慢速HTTP连接?

4
在Java集成测试中,是否可以模拟慢速HTTP连接,以便我可以定义服务器确认连接前等待的时间?最好是支持JAX-WS Web服务的解决方案。
背景: 我必须对一个中央超时配置器进行集成测试。配置器本身必须与技术无关。首先它支持JAX-WS Web服务,因此将在请求上下文中设置属性com.sun.xml.ws.connect.timeout。
P.S.:有其他问题询问如何一般模拟慢速连接。这个问题不同,因为我不能在单元测试中使用外部工具,并且必须能够定义特定的连接时间。

我建议使用EasyMock。虽然名字并不像它所暗示的那样容易,但它确实使得测试诸如http连接和数据库之类的东西变得更加容易。 - JREN
1
@JREN:我知道EasyMock,但是如何使用它模拟一个慢连接呢?连接是由JAX-WS创建的,所以注入一个mock很困难,不是吗? - Christian Strempfer
通常我们所做的是在类中创建一个受保护的方法,称为currentMillis,它返回System.currentTimeMillis(),这样我们就可以重写它,以返回测试类中的字段变量,通过简单地将时间添加到变量中来模拟任意长的时间跳跃。 - JREN
2个回答

2

太好了!我只需要修改NanoHTTPD#start()方法,使其调用一个自定义方法来创建ServerSocket,然后我重写了ServerSocket#accept()方法,在调用其超级实现之前让它休眠一段时间。 - Christian Strempfer

0

您可以通过嵌入在应用程序中的代理(http或socks)进行测试。然后,您可以告诉代理提供您需要测试的行为。

我不得不测试一个已断开的TCP/IP连接(如何重现静默丢弃的TCP/IP连接?),最终通过使用Java编写的SOCKS代理来模拟我正在寻找的行为。


是的,代理是可以的,但我该如何实现呢?我只熟悉servlet编程,而servlets并不处理连接本身。 - Christian Strempfer
JAX-WS 运行在 Web 应用程序所能处理的范围之下,您需要更好地将其集成到应用服务器本身中。您需要在启动应用服务器 JVM 时设置系统属性以重定向 http 流量。我建议您在问题中添加有关您的环境和您自己可以做什么的更多信息。像您使用的服务器这样的事情是非常相关的。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接