标签: Robolectric

  • 使用Robolectric模拟Http请求和响应

    习惯了用Gradle管理依赖以后突然回到Android开发,才发现Idea 12 对Android-Gradle项目支持很烂,只有手动下载依赖。

    Android App的开发比普通Java Web或者Java Application开发麻烦很多。主要是集成测试使用的Instrumented Test必须在模拟器或者真机上测试,挺耽误时间的。
    这样的测试通常粒度较大,测试的编写和维护较为困难,而最为重要的是,由于速度慢,如果使用TDD来进行开发,根本无法达到快速开发的要求。

    所以在Android开发中,尽可能多使用单元测试保证每个模块的正确性,来尽可能保证集成测试的成功率。

     

    基于Mockito的简单测试

    Android SDK也有测试框架,但是那个不是基于普通JVM的,运行起来还是需要模拟器或者真机。要基于普通JVM测试,就必须让模块尽可能的不依赖于Android的东西,需要依赖的也用Mockito等Mock掉。

    如果需要Mock的是自己的代码还好,如果是Android的东西,还需要处理各种状态和返回量。

    比如我们的APP需要调用WifiManager,如果只是检测Wifi是否开启还比较方便,只需要mock以后设定when就行了。

    WifiManager wifiManager = mock(WifiManager.class);
    when(wifiManager.isWifiEnabled()).thenReturn(true);

    如果我们需要扫描Wifi,然后检测Wifi状态等,工作就变动了。你需要仔细思考Android设备正常情况下的状态变动,还需要构造哦一个List<ScanResult>

    WifiManager wifiManager = mock(WifiManager.class);
    when(wifiManager.getScanResults()).thenReturn(Lists.<ScanResult>newArrayList());
    when(wifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED).thenReturn(WifiManager.WIFI_STATE_DISABLED).thenReturn(WifiManager.WIFI_STATE_ENABLED);

    其实以上问题还好,因为我们mock出了WifiManager以后将它传入调用的类就行了。

    publicclass LoginService {
    private WifiManager wifimanager;
    publicLoginService(WifiManager