单元测试
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! )