码迷,mamicode.com
首页 > 移动开发 > 详细

android单元测试框架Mockito使用

时间:2018-10-29 16:05:23      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:成功   login   f11   分享图片   mockito   image   roc   发布   null   

单元测试,早些年时常听到这个概念,真的有去做的确实少,基本都是自己功能上的测试,开发完测试跑一边没啥问题就发布了。这几天花了点心思看了下MockIto框架,记录博文。

  • MockIto官网文档在https://static.javadoc.io/org.mockito/mockito-core/2.23.0/org/mockito/Mockito.html。
  • MockIto框架是基于原生JUnit4,JUnit4是整个单元测试的基础,他能够帮我我们开发者更快,更高效的进行单元测试

1.在mvp的模式上,我们建立一个P层叫LuckinTestPresenter,大概流程为:注册-》验证此账号是否允许注册,允许-》注册成功,具体为

    /**
     * 注册账号密码
     * @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");
    }
}

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单元测试框架Mockito使用

标签:成功   login   f11   分享图片   mockito   image   roc   发布   null   

原文地址:http://blog.51cto.com/8912823/2310217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!