本文介绍了与robolectric V3.0测试WiFi连接时ShadowNetworkInfo总是TYPE_MOBILE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用Robolectric(3.0 RC2)来写一个SyncAdapter实现脱机一些在测试Android应用程序。该应用程序将在SIM卡的手机较少,其中将使用WiFi连接工厂运行。所以,我希望能写对我的WiFi连接检查code测试。

我写了一个简单的测试,根据例子我在网上找到影着的ConnectionManager,以模拟正对WiFi无线网络。然而,尽管的NetworkInfo设置TYPE_WIFI,连接管理器总是返回的NetworkInfo类型TYPE_MOBILE的。所以,我testSimple最后断言失败。我缺少的一个步骤?

 进口android.content.Context;
进口android.net.ConnectivityManager;
进口android.net.NetworkInfo;进口test.app.BuildConfig;进口org.junit.Before;
进口org.junit.Test;
进口org.junit.runner.RunWith;
进口org.robolectric.RobolectricGradleTestRunner;
进口org.robolectric.RuntimeEnvironment;
进口org.robolectric.Shadows;
进口org.robolectric.annotation.Config;
进口org.robolectric.shadows.ShadowConnectivityManager;
进口org.robolectric.shadows.ShadowNetworkInfo;进口java.io.IOException异常;引入静态junit.framework.Assert.assertEquals;
引入静态junit.framework.Assert.assertTrue;@RunWith(RobolectricGradleTestRunner.class)
@Config(常量= BuildConfig.class,舱单=/src/main/AndroidManifest.xml)
公共类DownloadSyncAdapterTest {    私人ConnectivityManager connectivityManager;
    私人ShadowConnectivityManager shadowConnectivityManager;
    私人ShadowNetworkInfo shadowOfActiveNetworkInfo;    @之前
    公共无效设置()抛出IOException
        connectivityManager = getConnectivityManager();
        shadowConnectivityManager = Shadows.shadowOf(connectivityManager);
        shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo());    }    @测试
    公共无效testSimple(){        的NetworkInfo NETWORKINFO = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED,ConnectivityManager.TYPE_WIFI,0,真实,真实);
        shadowConnectivityManager.setNetworkInfo(ConnectivityManager.TYPE_WIFI,NETWORKINFO);        的NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo();
        assertTrue(activeInfo =空&放大器;!&放大器; activeInfo.isConnected());        //断言失败:返回TYPE_MOBILE
        的assertEquals(ConnectivityManager.TYPE_WIFI,activeInfo.getType());
    }    私人ConnectivityManager getConnectivityManager(){
        返回(ConnectivityManager)RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE);
    }}


解决方案

原来我是做了错误的API调用。要设置在ShadowConnectionManager活动的网络信息,正确的方法是setActiveNetworkInfo而不是setNetworkInfo。

下面是修正code:

 进口android.content.Context;
进口android.net.ConnectivityManager;
进口android.net.NetworkInfo;进口test.app.BuildConfig;进口org.junit.Before;
进口org.junit.Test;
进口org.junit.runner.RunWith;
进口org.robolectric.RobolectricGradleTestRunner;
进口org.robolectric.RuntimeEnvironment;
进口org.robolectric.Shadows;
进口org.robolectric.annotation.Config;
进口org.robolectric.shadows.ShadowConnectivityManager;
进口org.robolectric.shadows.ShadowNetworkInfo;进口java.io.IOException异常;引入静态junit.framework.Assert.assertEquals;
引入静态junit.framework.Assert.assertTrue;@RunWith(RobolectricGradleTestRunner.class)
@Config(常量= BuildConfig.class,舱单=/src/main/AndroidManifest.xml)
公共类DownloadSyncAdapterTest {    私人ConnectivityManager connectivityManager;
    私人ShadowConnectivityManager shadowConnectivityManager;
    私人ShadowNetworkInfo shadowOfActiveNetworkInfo;    @之前
    公共无效设置()抛出IOException
        connectivityManager = getConnectivityManager();
        shadowConnectivityManager = Shadows.shadowOf(connectivityManager);
        shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo());    }    @测试
    公共无效testSimple(){        的NetworkInfo NETWORKINFO = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED,ConnectivityManager.TYPE_WIFI,0,真实,真实);
        //正确调用API:使用setActiveNetworkInfo代替setNetworkInfo
        shadowConnectivityManager.setActiveNetworkInfo(NETWORKINFO);        的NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo();
        assertTrue(activeInfo =空&放大器;!&放大器; activeInfo.isConnected());        //断言现在经过:正确返回TYPE_WIFI
        的assertEquals(ConnectivityManager.TYPE_WIFI,activeInfo.getType());
    }    私人ConnectivityManager getConnectivityManager(){
        返回(ConnectivityManager)RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

I'm attempting to use Robolectric (3.0 RC2) to write some offline tests for a SyncAdapter implementation in an Android app. The app will be run on SIM-less handsets in factories which will use the wifi connection. So I'd like to be able to write tests against my wifi connectivity checking code.

I've written a simple test, based on examples I found online to shadow the ConnectionManager with a view to simulate being on the wifi. However, despite setting the NetworkInfo to TYPE_WIFI, the connection manager always returns a NetworkInfo type of TYPE_MOBILE. So the final assertion 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);
    }

}
解决方案

It turns out I was making the wrong API call. To set the active network info on the ShadowConnectionManager, the correct method is setActiveNetworkInfo and 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);
    }

这篇关于与robolectric V3.0测试WiFi连接时ShadowNetworkInfo总是TYPE_MOBILE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 00:52