ShadowNetworkInfo is always TYPE_MOBILE when testing WiFi connectivity with robolectric v3.0

I am trying to use Robolectric (3.0 RC2) to write some standalone tests to implement the SyncAdapter in an Android application. The application will work on phones with SIM cards in factories that will use a Wi-Fi connection. Therefore, I would like to write tests against my Wi-Fi connection verification code.

I wrote a simple test based on examples I found on the Internet to obscure the ConnectionManager to simulate presence on Wi-Fi. However, despite setting NetworkInfo to TYPE_WIFI, the connection manager always returns the NetworkInfo type TYPE_MOBILE. Thus, the final statement of my testSimple fails. Am I missing a step?

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); } } 
+3
source share
1 answer

Turns out I was making the wrong API call. To set active network information in the ShadowConnectionManager, the correct method is setActiveNetworkInfo, not setNetworkInfo.

Here's the corrected code:

 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); } 
+6
source

Source: https://habr.com/ru/post/1208046/


All Articles