亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述android单元测试框架Mockito使用相关的知识,希望能为你提供帮助。
单元测试,早些年时常听到这个概念,真的有去做的确实少,基本都是自己功能上的测试,开发完测试跑一边没啥问题就发布了。这几天花了点心思看了下MockIto框架,记录博文。
- MockIto官网文档在https://static.javadoc.io/org.mockito/mockito-core/2.23.0/org/mockito/Mockito.html。
- MockIto框架是基于原生JUnit4,JUnit4是整个单元测试的基础,他能够帮我我们开发者更快,更高效的进行单元测试
/**
* 注册账号密码
* @param phone 账号
* @param passWord 密码
*/
public void register(String phone, String passWord) {
System.out.println("到达register");
}
/**
* 验证是否可以注册
* @param phone
* @param passWord
*/
public void verification(String phone, String passWord) {
System.out.println("到达verification");
if (!isLimit()) {
register(phone, passWord);
}
}
/**
* 注册之前检查这个手机号是否被限制
* @return
*/
public boolean isLimit() {
return false;
}
2:我们现在要在单元测试中,验证点击注册的时候程序是否有跑过verification方法,那么我们的单元测试案例为
public class LuckinPresenterTest {
@Test
public void check() {
//mockito会模拟LoginPresenterTest这个需要测试的class,返回一个LoginPresenterTest对象
LuckinTestPresenter luckinTestPresenter = Mockito.mock(LuckinTestPresenter.class);
//主动调用验证方法
luckinTestPresenter.verification("2018091280", "word");
//现在我们要了利用MockIto验证程序到这为止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
run发现报错
文章图片
为啥呢,因为你要验证的register()并没有被调用,为啥呢,看程序,应该执行的呀,这里需要注意的就是所哟Mock标记的类都是虚拟的,返回值都是null,也就是说你无法用一个为null的对象去调用register方法。如果我就要这么做呢,那就用spy标注吧。修改案例改为:
public class LuckinPresenterTest {
@Test
public void check() {
//mockito会模拟LoginPresenterTest这个需要测试的class,返回一个LoginPresenterTest对象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//主动调用验证方法
luckinTestPresenter.verification("2018091280", "word");
//现在我们要了利用MockIto验证程序到这为止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
run结果为-》成功
文章图片
2:现在有一个需求,我要测试当我isLimit()返回都会true时程序有没有走register,我又不想动原p层代码,那咋办呢,有办法,我们修改为
public class LuckinPresenterTest {
@Test
public void check() {
//mockito会模拟LoginPresenterTest这个需要测试的class,返回一个LoginPresenterTest对象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//主动调用验证方法
Mockito.when(luckinTestPresenter.isLimit()).thenReturn(true);
//控住islimit返回true
luckinTestPresenter.verification("2018091280", "word");
//现在我们要了利用MockIto验证程序到这为止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
【android单元测试框架Mockito使用】run结果为
文章图片
程序走过了verification,之后报错(就说明mock验证失败,程序没有走到register方法,因为你已经把isLimit返回值设为了true)。
相关方法为:
public class LuckinPresenterTest {
@Test
public void check() {
//mockito会模拟LoginPresenterTest这个需要测试的class,返回一个LoginPresenterTest对象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//控住isTourise返回true
Mockito.when(luckinTestPresenter.isLimit()).thenReturn(true);
//主动验证操作
luckinTestPresenter.verification("2018091280", "word");
//现在我们要了利用MockIto验证程序到这为止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
//验证register的方法是否调用,并且是否为1次,并且参数一致
Mockito.verify(luckinTestPresenter, Mockito.times(1)).register("2018091280", "word");
//验证register的方法从未调用过
Mockito.verify(luckinTestPresenter, Mockito.never()).register("2018091280", "word");
//验证register的方法是否调用,并且是否为1次,参数忽略
Mockito.verify(luckinTestPresenter, Mockito.times(1)).register(Mockito.anyString(), Mockito.anyString());
}
}
推荐阅读
- Android StudioERROR: x86 emulation currently requires hardware acceleration!报错解决傻瓜教程~
- 网络结构MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications论文解析
- 小程序官网CMS开源项目出炉,Weixin-App-CMS 1.0 版本正式发布
- 最简容器化动手小实践——再战flappybird
- Android防止GC的方法
- Error:Failed to resolve: com.android.support:appcompat-v7
- Django创建完全独立的APP
- android studio gradle配置成本地离线zip包
- Win10系统bluetooth文件传输未完成怎样办?