单元测试从Mockito到PowerMock再到Robolectric的详细解析

本文详细介绍了Mockito、PowerMock和Robolectric在单元测试中的应用。Mockito专注于纯Java代码的测试,提供方法调用mock、指定行为等功能。PowerMock作为Mockito的增强版,增加了mock私有属性和方法、final及静态方法的能力。而Robolectric则专用于Android系统类的测试,如UI事件、四大组件等,通过Shadow对象实现行为测试。
摘要由CSDN通过智能技术生成

1.Mockito侧重点是纯Java代码的测试:方法调用mock,指定方法行为,截取参数,截取Callback回调

,所谓Mock一个对象,其实可以理解成一个对象的动态代理,然后偷梁换柱改变其属性和方法行为,也就是说如果你想改变谁的行为和属性你就要mock谁

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,sdk = Build.VERSION_CODES.LOLLIPOP)
public class QxMockitActvityTest {

    private QxMockitActvity mMockitActvity;
    private Button mbtn;
    @Mock
    private QxNetMananger mMananger;
    @Mock
    private QxVertifyUrl mVertifyUrl;

    @Before
    public void setUp() throws Exception {

        ShadowLog.stream=System.out;//启动测试的时候所有的Log日志都输出
        MockitoAnnotations.initMocks(this);//初始化Mockit

        //QxMockitActvity中的QxNetManangerQxVertifyUrl都是从QxAppNetModle这里得到的,
          //所以我们从这里开始Mock才能保证
        //QxMockitActvity中的QxNetManangerQxVertifyUrl也是mock        QxAppNetModle netModle=Mockito.mock(QxAppNetModle.class);

        when(netModle.provideNetManager()).thenReturn(mMananger);
        when(netModle.provideVertifyUrl()).thenReturn(mVertifyUrl);

        mMockitActvity= Robolectric.setupActivity(QxMockitActvity.class);//启动Activity
        mbtn= (Button) mMockitActvity.findViewById(R.id.btn_changge);

    }

    @After
    public void tearDown() throws Exception {
        mMockitActvity.finish();
        mMockitActvity=null;
    }

    @Test
    public void testload(){
        //第一次触发返回true,第二次触发返回false,第三次触发返回true
//        when(mVertifyUrl.vertifyUrl(anyString())).thenReturn(true).thenReturn(false)
.thenReturn(true);
        //下面也可以直接用thenAnther代替thenReturn 用Anther的好处就是可以判对参数然后再做出方案
        when(mVertifyUrl.vertifyUrl(anyString())).thenAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) throws Throwable {
                Object[] argments = invocation.getArguments();
                String str= (String) argments[0];
                if(str.equals("wr"))return false;
                return true;
            }
        }).thenAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) throws Throwable {
                Object[] argments = invocation.getArguments();
                String str= (String) argments[0];
                if(str.equals("qr"))return true;
                return false;
            }
        }).thenAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) throws Throwable {
                Object[] argments = invocation.getArguments();
                String str= (String) argments[0];
                if(str.equals("qr"))return false;
                return true;
            }
        });

        //mVertifyUrl不是mock的而是spy比如Mockito.spy(QxVertifyUrl.class)就要用doReturndoAnther


        doAnswer(new Answer() {
            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
                Object[] arguments = invocation.getArguments();//得到截取方法所有的参数
                //QxNetCallback是方法的第二个参数
                QxNetMananger.QxNetCallback callback= (QxNetMananger.QxNetCallback) arguments[1];
                //模拟成功了
                callback.onSuccess("qx");
                Log.e("Qx","qx");
                return "wr";
            }
        }).when(mMananger).load(anyString(), Mockito.any(QxNetMananger.QxNetCallback.class));


        mbtn.performClick();
        mbtn.performClick();
        mbtn.performClick();
        //验证是否调用了俩次
        verify(mMananger,times(2)).load(anyString(),Mockito.any(QxNetMananger.QxNetCallback.class));

    }
}


2. PowerMock是Mockito的升级版,它除了有Mockito的大部分功能外,还有几个特殊功能:mock私有属性和方法  测试私有属性和方法 

    mock final修饰的方法  mockStatic静态方法  还有就是它还可以whenNew来mock方法内部实例化的变量,然后像傀儡一样操作它。

    说他只有Mockito大部分的功能是因为我测试了下doAnther窃取CallBack参数,操作回调方法不成功,还有就是对android方法的支持欠缺


<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值