Android单元测试

Posted by HaoChen Blog on October 13, 2016

单元测试

Mockito

方法一:
	验证某个类的方法是否被调用,参数是否正确
	  Mockito.verify(mockUserManager).performLogin(anyString(), anyString());
使用: 1. 先Mock出该类对象
	  2. 把对象传入需要调用的类中进行调用
	  3.  调用  Mockito.verify(mockUserManager).performLogin(anyString(), anyString());验证方法是否正确调用和参数是否正确


方法二:
	虚拟化某个方法调用,并返回一个值,指定mock对象的某些方法的行为
	Mockito.when(validator.verifyPassword(anyString())).thenReturn(true);
	
使用:	
	1.先mock出该类的对象
	2,调用Mockito.when(validator.verifyPassword(anyString())).thenReturn(true);方法模拟调用
	3,验证 Assert.assertEquals(true, validator.verifyPassword("xiaochuangishandsome11"));

方法三:
	指定mock对象执行特定的动作的写法
	Mockito.doAnswer(desiredAnswer).when(mockObject).targetMethod(args);

	 Mockito.doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        //这里可以获得传给performLogin的参数
        Object[] arguments = invocation.getArguments();

        //callback是第三个参数
        NetworkCallback callback = (NetworkCallback) arguments[2];

        callback.onFailure(500, "Server error");
        return 500;
    }
	}).when(mockUserManager).performLogin(anyString(), anyString(), any(NetworkCallback.class));

当然,使用Mockito.doAnswer()需要创建一个Answer对象,这有点麻烦,代码看起来也繁琐,如果想简单的指定目标方法“什么都不做”,那么可以使用Mockito.doNothing()。如果想指定目标方法“抛出一个异常”,那么可以使用Mockito.doThrow(desiredException)。如果你想让目标方法调用真实的逻辑,可以使用Mockito.doCallRealMethod()。(什么??? 默认不是会这样吗??? No! )