我正在研究一个使用Robolectric进行单元测试的Android项目.
我没有禁用互联网连接工作.
我有一个方法,它使用HttpUrlConnection向HTTP服务器发送请求并从HTTP服务器获取响应:boolean sendRequest().如果请求成功,则返回true.
private boolean sendRequest() throws Exception
{
URL url = new URL("http://example.com");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection( );
int statusCode = urlConnection.getResponseCode( );
return statusCode == 200;
}
Run Code Online (Sandbox Code Playgroud)
在帮助器类中,我有两种方法:void setConnectivity(boolean enable)和boolean checkConnectivity().
public static void setConnectivity( boolean enabled) throws Exception
{
Context context = Robolectric.application.getApplicationContext();
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Robolectric.shadowOf(wifiManager).setWifiEnabled(enabled);
wifiManager = (WifiManager) Robolectric.application.getSystemService(Context.WIFI_SERVICE);
Robolectric.shadowOf(wifiManager).setWifiEnabled(enabled);
ConnectivityManager dataManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
Robolectric.shadowOf(dataManager).setBackgroundDataSetting(enabled);
dataManager = (ConnectivityManager)Robolectric.application.getSystemService(Context.CONNECTIVITY_SERVICE);
Robolectric.shadowOf(dataManager).setBackgroundDataSetting(enabled);
Robolectric.shadowOf(dataManager.getActiveNetworkInfo()).setConnectionStatus(enabled);
Intent connIntent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION); …Run Code Online (Sandbox Code Playgroud) 执行请求后,我想检查请求标头,但它不起作用.
我调用getRequestProperties()了一个实例,sun.net.www.protocol.http.HttpURLConnection我总是得到一个带有"已经连接"消息的IllegalStateException.好像我想设置请求属性.但我只想读它们.
此行为的责任代码位于HttpUrlConnection中:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection
的.java#HttpURLConnection.getRequestProperties%28%29
public synchronized Map<String, List<String>> getRequestProperties() {
if (connected)
throw new IllegalStateException("Already connected");
// ...
}
Run Code Online (Sandbox Code Playgroud)
好的,也许我应该只在断开连接后读取请求属性.但事实证明,disconnect()不设置connected到false.虽然它应该:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection.disconnect% 28%29
如果我将流读到最后,它似乎也没有什么区别.在调用disconnect之前或之后关闭InputStream也没有什么区别.
我糊涂了.你能帮助我吗?
disconnect()设置连接到false?重现这个的代码是Android的单元测试(我使用Robolectric),但我认为你也可以在Java项目中使用它,并在删除测试注释后从main()调用它:
/**
* Test if HttpUrlConnection works as expected, because in some cases it seems it doesn't
*
* @throws Exception
*/
@Test
public void testHttpUrlConnection() throws Exception
{
final URL url = new URL("http://www.stackoverflow.com");
final HttpURLConnection …Run Code Online (Sandbox Code Playgroud)