使用Robolectric更改Android连接

bac*_*dev 6 java android robolectric

我正在研究一个使用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);
    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;
}
Run Code Online (Sandbox Code Playgroud)

我已经打包了所有我能找到的通过Robolectric禁用互联网连接的setConnectivity()方法,当检查通过checkConnectivity()我得到预期的返回值时,BUT sendRequest()总是返回true,虽然我期望在禁用互联网连接时请求失败.

@Test
public void testConnectivity() throws Exception
{
    setConnectivity(true);
    assertTrue(checkConnectivity());
    assertTrue(sendRequest());

    setConnectivity(false);
    assertFalse(checkConnectivity());
    assertFalse(sendRequest()); // Assertion failed
}
Run Code Online (Sandbox Code Playgroud)

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

测试方法在Robolectric测试运行器的测试类中.

bac*_*dev 0

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

我找到了一个 Stack Overflow 答案,它似乎解决了我想要实现的目标,尽管它不是使用 Robolectric,而是使用模拟框架:
回答“Robolectric:在测试中模拟网络错误”