首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Robolectric改变Android连接

使用Robolectric改变Android连接
EN

Stack Overflow用户
提问于 2014-12-01 22:09:43
回答 1查看 2.4K关注 0票数 7

我正在做一个使用Robolectric进行单元测试的Android项目。

我不知道禁用互联网连接是不起作用的。

我有一个方法,它使用HttpUrlConnection向HTTP服务器发送请求并从其获得响应:boolean sendRequest()。如果请求成功,则返回true。

代码语言:javascript
复制
private boolean sendRequest() throws Exception
{
    URL url = new URL("http://example.com");
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection( );
    int statusCode = urlConnection.getResponseCode( );
    return statusCode == 200;
}

在helper类中,我有两个方法:void setConnectivity(boolean enable)boolean checkConnectivity()

代码语言:javascript
复制
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);
    connIntent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, enabled);
    Robolectric.getShadowApplication().sendBroadcast(connIntent);

    ShadowSettings shadowSettings = new ShadowSettings();
    shadowSettings.setWifiOn(enabled);
    shadowSettings.setAirplaneMode(enabled);
}

public static boolean checkConnectivity() throws Exception
{
    Context context = Robolectric.application.getApplicationContext();

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    if (wifiNetwork != null && wifiNetwork.isConnected()) {
        return true;
    }

    NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (mobileNetwork != null && mobileNetwork.isConnected()) {
        return true;
    }

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        return true;
    }

    return false;
}

我已经将我能找到的所有通过Robolectric禁用互联网连接的东西打包到setConnectivity()方法中,当通过checkConnectivity()检查时,我得到了预期的返回值,但sendRequest()总是返回true,尽管我预计当互联网连接被禁用时,请求会失败。

代码语言:javascript
复制
@Test
public void testConnectivity() throws Exception
{
    setConnectivity(true);
    assertTrue(checkConnectivity());
    assertTrue(sendRequest());

    setConnectivity(false);
    assertFalse(checkConnectivity());
    assertFalse(sendRequest()); // Assertion failed
}

我是否错过了一个用于禁用互联网连接的Robolectric方法调用?或者也许我的整个方法都是错误的,实际的请求永远不会受到Robolectric设置的影响?

测试方法位于具有Robolectric测试运行器的测试类中。

EN

回答 1

Stack Overflow用户

发布于 2015-01-22 22:08:24

由于我的问题没有得到任何答案,我在网上也找不到答案,我想这是不可能的。

我找到了一个Stack Overflow的答案,它似乎解决了我想要实现的问题,虽然它不是使用Robolectric,但使用了一个模拟框架:

Answer to "Robolectric: simulate network error in test"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27230186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档