Android技术知识Android知识

Android单元测试-Mockito

2017-03-11  本文已影响0人  oden

本文记录Mockito的简单使用。
CSDN同步发布

Mockito概念相关

Mock就是创建一个类的虚假对象,在测试环境中,用来替换掉真实的对象,主要提供两大功能:

    testCompile "org.mockito:mockito-core:2.0.57-beta"

Mockito使用

验证方法调用

Mockito.verify(mockUserManager).performLogin("xiaochuang", "xiaochuang password");

这行代码其实是:
Mockito.verify(mockUserManager, Mockito.times(1)).performLogin("xiaochuang", "xiaochuang password");
的简写.
对于调用次数的验证,除了可以验证固定的多少次,还可以验证最多,最少从来没有等等,方法分别是:atMost(count), atLeast(count), never()等等

Mockito.verify(mockUserManager).performLogin(Mockito.anyString(), Mockito.anyString());
anyString()表示任何一个字符串都可以。
类似anyString,还有anyInt, anyLong, anyDouble等等。anyObject表示任何对象,any(clazz)表示任何属于clazz的对象

指定mock对象的某些方法的行为

指定返回

Mockito.when(mockObject.targetMethod(args)).thenReturn(desiredReturnValue);

//当调用mockValidator的verifyPassword方法时,返回true,无论参数是什么
Mockito.when(validator.verifyPassword(anyString())).thenReturn(true);

执行特定的动作

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));

当调用mockUserManager的performLogin方法时,会执行answer里面的代码,上面的例子是直接调用传入的callback的onFailure方法,同时传给onFailure方法500和"Server error"

spy

如果不指定的话,一个mock对象的所有非void方法都将返回默认值:int、long类型方法将返回0,boolean方法将返回false,对象方法将返回null等等;而void方法将什么都不做。
spy与mock的唯一区别就是默认行为不一样:spy对象的方法默认调用真实的逻辑,mock对象的方法默认什么都不做,或直接返回默认值。

Mockito注解的使用

@Mock的基本用法

需要mock的对象可用@Mock注解,同时需要调用 MockitoAnnotations.initMocks(target);

   @Mock
    UserManager mockUserManager;

    @Mock
    PasswordValidator mockValidator;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    loginPresenter = new LoginPresenter(mockUserManager, mockValidator);
}

@InjectMocks

我们可以使用@InjectMocks来让Mockito自动使用mock出来的mockUserManager和mockValidator构造出一个LoginPresenter

 @InjectMocks
    LoginPresenter loginPresenter;

参考文章

Android 单元测试--Mock及Mockito
Mockito
使用Mockito Annotation快速创建Mock

上一篇 下一篇

猜你喜欢

热点阅读