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中的QxNetMananger和QxVertifyUrl都是从QxAppNetModle这里得到的, //所以我们从这里开始Mock才能保证 //QxMockitActvity中的QxNetMananger和QxVertifyUrl也是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)就要用doReturn和doAnther 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方法的支持欠缺