我正在编写两个Junit测试用例来测试超时
@Test
public void connectionTimeoutTest()
{
String myurl = "http://serverip:serverport/context";
URL url = new URL(myurl);
URLConnection con = url.openConnection();
//how to check connectionTimeout but not socket time out
//what I think
//is it good enough to check with a server ip that does not exist ?
}
@Test
public void socketTimeoutTest()
{
String myurl = "http://localhost:serverport/context";
URL url = new URL(myurl);
URLConnection con = url.openConnection();
//how to check successful connection and timesout at socket (or port)
//what I think
//IP should exist (so it is localhost) but should not be listening on the port
}
我很困惑,因为我不确定我的方法是否正确。每种情况的例外情况是什么?另外,是否可以根据异常进行区分?
还有我错过的其他暂停时间吗?
Thanks in advance
您需要在打开任何流或获得响应代码之前调用URLConnection.setConnectTimeout()
。如果发生连接超时,它将抛出一个ConnectException
,文本为'connection timed out'。
请注意,与Javadoc相反,默认连接超时大约是一分钟(取决于平台),而不是无限,并且您可以通过这种方式减少默认连接超时,但不能增加它。
对于读取超时,我认为这就是你所说的"套接字超时",你必须调用URLConnection.setReadTimeout()
。如果它开火,你会得到一个SocketTimeoutException
。在这种情况下,根据Javadoc, 0表示无穷大。
我不太清楚您的单元测试需求。如果您要测试服务器的连接(和套接字读取)超时值,上面提到的方法将只允许您验证某个"最大"阈值。但是您仍然无法确认TCP服务器端超时设置。TCP服务器的连接(和读取)超时取决于平台(OS)和TCP堆栈实现等因素。
同样,当与这个URLConnection引用的资源通信时,通过setConnectTimeout
或setReadTimeout()
设置的超时仅在客户端套接字上。
在第一个测试用例中,我认为它会得到java.net.UnknownHostException,因为不存在ip地址。
如果你想引起一个套接字连接超时异常(确切地说,得到像"java.net.SocketTimeoutException: connect timed out"这样的消息),只需使用URLConnection.setConnectTimeout(10),将参数设置得尽可能小,但为正;
在第二个测试用例中也是一样,您可以使用URLConnection.setReadTimeout(10)来引起一个读取超时异常("java.net.SocketTimeoutException: read timed out")。