习惯了用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