包管的参数传递的前提下,我们接下来须要对接口返回状况进行测试,起首就是成功态的接口返回。Mockito.when的感化是设定预期返回结不雅,例如case testRequestSuccess()所要测试的是请求成功且返回码精确的情况,所以我们对response的预期就是让它履行onNext办法,同时返回我们初始化好的完全精确的接口数据。Mockito.when使得测试代码可以完全按照我们所预期的履行。不过这个声明必须在办法履行之前,即Mockito.when必须比model.request(listener,"沈阳");先履行才会生效。Junit供给了丰富的assert断言机制,借助assert我们可以实现多种情况的测试,然而对于没有明白返回值的void办法,assert就显得有些力所不及,因为它无法找到一个标准进行断言。这时刻须要应用mockito的verify办法,它的感化是验证mock对象的某一个办法是否获得了精确的履行Mockito.verify(listener).showLoading();就是验证加载进度条是否可以或许正常显示,ArgumentCaptor是一个参数捕获,它可以捕获onNext返回的数据,经由过程assert断言,我们可以验证成功情况下数据是否精确。数据成功情况下,我们有一个收集数据向视图数据转换的过程,这个转换办法是在convert类中履行的操作,因为我们做的是单位测试而非集成测试,所以基于WeatherModel这个测试类,我们只须要验证到convertData()这个函数是否精确获得了调用即可,数据转换的内容由Convert类的单位测试进行跟踪即可。
- @Testpublic voidtestStatusError() {
- initResponse();
- netData.setStatus(1001);
- Mockito.when(api.getWeather(queryMap)).thenReturn(Observable.just(netData));
- ArgumentCaptor captor = ArgumentCaptor.forClass(WeatherData.class);
- model.request(listener,"沈阳");
- Mockito.verify(api).getWeather(queryMap);
- Mockito.verify(listener).showLoading();
- Mockito.verify(listener).fail(null,ServerCode.get(netData.getStatus()).getMessage());
- }
Request是一个接口,我们不克不及够包管每次请求我们的办事器都可以或许授与精确应答,同时用户在发出请求的时刻我们也不克不及够包管用户所处的收集状况是否通行。所以我们在设计Model类的时刻也要将异常态推敲在内,对接口的异常情况进行处理,有时刻我们须要本身创造一些异常来验证我们代码的结实程度。同样的,我们的测试类也须要有一个专门的办法来包管异常态的测试。testRequestFail()的测试办法与成功的办法的不合之处在于我们起首我们须要mock的不是接口数据,而是一个异常,Exception exception = new Exception("exception");留意,这个Exception中的参数等于异常信息,因为我们的fail办法中有异常信息的显示,所以这个参数是必须要加上的,不然e.getLocalizedMessage()会抛出NPE。别的,这个时刻的Mockito.when的期望也有所改变,此次我们期望的是函数履行onError办法。
- @Testpublic voidtestCancelRequest() {
- Subscription subscription =mock(Subscription.class);
- model.setSubscription(subscription);
- model.cancelRequest();
- verify(subscription).unsubscribe();
- }
Model类中最后一个case是testCancelRequest()它的感化是,在合适的时刻解绑request,我们的收集请求是异步的,也就是说当我们调用请求的activity或是fragment destroy的时刻,如不雅我们没有解除绑定,是存在内存泄漏风险的。当然,我们能想到的问题,Rxjava的保护者们也必定想到了,Subscription就是便利我们在生命周期停止的时刻对Rx解绑。验证办法很简单,照样经由过程verify办法,验证解绑办法是否获得了精确履行。
推荐阅读
前几天收到了一名网友的乞助,表示他无法正常上彀,并且当他在查找断网原因刹那,竟然发明默认的网关地址也消掉了。面对这种情况,他表示不知该若何处理。实际上,出现默认网关空白的情况有下面几个原因。起首,可能>>>详细阅读
本文标题:安卓单元测试全攻略,让代码测试一劳永逸
地址:http://www.17bianji.com/lsqh/36696.html
1/2 1