小编bac*_*dev的帖子

使用Robolectric更改Android连接

我正在研究一个使用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)

java android robolectric

6
推荐指数
1
解决办法
1871
查看次数

HttpURLConnection.getRequestProperties()抛出IllegalStateException:"已经连接"

执行请求后,我想检查请求标头,但它不起作用.

我调用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()不设置connectedfalse.虽然它应该: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也没有什么区别.

我糊涂了.你能帮助我吗?

  1. 为什么不disconnect()设置连接到false?
  2. 为什么我在连接urlConnection时无法读取请求属性?
  3. 如何在请求后正确读取请求标头?

重现这个的代码是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)

java android httpurlconnection

4
推荐指数
1
解决办法
3076
查看次数

标签 统计

android ×2

java ×2

httpurlconnection ×1

robolectric ×1