gpt4 book ai didi

android - 使用 robolectric v3.0 测试 WiFi 连接时,ShadowNetworkInfo 始终为 TYPE_MOBILE

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:46 25 4
gpt4 key购买 nike

我正在尝试使用 Robolectric (3.0 RC2) 为 Android 应用程序中的 SyncAdapter 实现编写一些离线测试。该应用程序将在使用 wifi 连接的工厂中的无 SIM 卡手机上运行。所以我希望能够针对我的 wifi 连接检查代码编写测试。

我已经编写了一个简单的测试,基于我在网上找到的示例来隐藏 ConnectionManager 以模拟在 wifi 上。然而,尽管将 NetworkInfo 设置为 TYPE_WIFI,连接管理器总是返回 TYPE_MOBILE 的 NetworkInfo 类型。所以我的 testSimple 的最终断言失败了。我错过了一步吗?

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import test.app.BuildConfig;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowConnectivityManager;
import org.robolectric.shadows.ShadowNetworkInfo;

import java.io.IOException;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;



@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, manifest = "/src/main/AndroidManifest.xml")
public class DownloadSyncAdapterTest {

private ConnectivityManager connectivityManager;
private ShadowConnectivityManager shadowConnectivityManager;
private ShadowNetworkInfo shadowOfActiveNetworkInfo;

@Before
public void setUp() throws IOException {
connectivityManager = getConnectivityManager();
shadowConnectivityManager = Shadows.shadowOf(connectivityManager);
shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo());

}

@Test
public void testSimple() {

NetworkInfo networkInfo = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, true);
shadowConnectivityManager.setNetworkInfo(ConnectivityManager.TYPE_WIFI, networkInfo);

NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo();
assertTrue(activeInfo != null && activeInfo.isConnected());

// Assertion fails: Returns TYPE_MOBILE
assertEquals(ConnectivityManager.TYPE_WIFI, activeInfo.getType());


}

private ConnectivityManager getConnectivityManager() {
return (ConnectivityManager) RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE);
}

}

最佳答案

事实证明我进行了错误的 API 调用。要在 ShadowConnectionManager 上设置 Activity 网络信息,正确的方法是 setActiveNetworkInfo 而不是 setNetworkInfo。

修改后的代码:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import test.app.BuildConfig;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowConnectivityManager;
import org.robolectric.shadows.ShadowNetworkInfo;

import java.io.IOException;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;



@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, manifest = "/src/main/AndroidManifest.xml")
public class DownloadSyncAdapterTest {

private ConnectivityManager connectivityManager;
private ShadowConnectivityManager shadowConnectivityManager;
private ShadowNetworkInfo shadowOfActiveNetworkInfo;

@Before
public void setUp() throws IOException {
connectivityManager = getConnectivityManager();
shadowConnectivityManager = Shadows.shadowOf(connectivityManager);
shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo());

}

@Test
public void testSimple() {

NetworkInfo networkInfo = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, true);
// Correct API call: use setActiveNetworkInfo instead of setNetworkInfo
shadowConnectivityManager.setActiveNetworkInfo(networkInfo);

NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo();
assertTrue(activeInfo != null && activeInfo.isConnected());

// Assertion now passes: Correctly returns TYPE_WIFI
assertEquals(ConnectivityManager.TYPE_WIFI, activeInfo.getType());


}

private ConnectivityManager getConnectivityManager() {
return (ConnectivityManager) RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE);
}

关于android - 使用 robolectric v3.0 测试 WiFi 连接时,ShadowNetworkInfo 始终为 TYPE_MOBILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30625378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com