0
点赞
收藏
分享

微信扫一扫

Android单元测试系列(3)-Mock之Mockito

软件共享软件 2022-04-18 阅读 69

一、官网

Mockito:

https://github.com/mockito/mockito

Mockito (Mockito 4.4.0 API)

二、Demo示例

参考Android Developer中提到的示例来说明Mockito用法。

1. 目录结构

2. 被测试的类

// gradle引入

dependencies {

    // test目录
    testImplementation 'org.mockito:mockito-core:4.4.0'

    // androidTest目录
    //androidTestImplementation "org.mockito:mockito-android:4.4.0"

}

// 被测试类为 SharedPreferencesHelper

package com.fanff.unittestdemo.mockdemo;

import android.content.SharedPreferences;
import java.util.Calendar;

/**
 * 参考Google官网示例:https://github.com/android/testing-samples/tree/master/unit/BasicSample
 */
public class SharedPreferencesHelper {
    // Keys for saving values in SharedPreferences.
    static final String KEY_NAME = "key_name";
    static final String KEY_DOB = "key_dob_millis";
    static final String KEY_EMAIL = "key_email";

    private final SharedPreferences mSharedPreferences;

    public SharedPreferencesHelper(SharedPreferences sharedPreferences) {
        mSharedPreferences = sharedPreferences;
    }

    public boolean savePersonalInfo(SharedPreferenceEntry sharedPreferenceEntry){
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        editor.putString(KEY_NAME, sharedPreferenceEntry.getName());
        editor.putLong(KEY_DOB, sharedPreferenceEntry.getDateOfBirth().getTimeInMillis());
        editor.putString(KEY_EMAIL, sharedPreferenceEntry.getEmail());

        // Commit changes to SharedPreferences.
        return editor.commit();
    }

    public SharedPreferenceEntry getPersonalInfo() {
        // Get data from the SharedPreferences.
        String name = mSharedPreferences.getString(KEY_NAME, "");
        Long dobMillis =
                mSharedPreferences.getLong(KEY_DOB, Calendar.getInstance().getTimeInMillis());
        Calendar dateOfBirth = Calendar.getInstance();
        dateOfBirth.setTimeInMillis(dobMillis);
        String email = mSharedPreferences.getString(KEY_EMAIL, "");

        // Create and fill a SharedPreferenceEntry model object.
        return new SharedPreferenceEntry(name, dateOfBirth, email);
    }
}
package com.fanff.unittestdemo.mockdemo;

import java.util.Calendar;

public class SharedPreferenceEntry {
    // Name of the user.
    private final String mName;

    // Date of Birth of the user.
    private final Calendar mDateOfBirth;

    // Email address of the user.
    private final String mEmail;

    public SharedPreferenceEntry(String name, Calendar dateOfBirth, String email) {
        mName = name;
        mDateOfBirth = dateOfBirth;
        mEmail = email;
    }

    public String getName() {
        return mName;
    }

    public Calendar getDateOfBirth() {
        return mDateOfBirth;
    }

    public String getEmail() {
        return mEmail;
    }
}

3. 测试类

    public boolean savePersonalInfo(SharedPreferenceEntry sharedPreferenceEntry){
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        editor.putString(KEY_NAME, sharedPreferenceEntry.getName());
        editor.putLong(KEY_DOB, sharedPreferenceEntry.getDateOfBirth().getTimeInMillis());
        editor.putString(KEY_EMAIL, sharedPreferenceEntry.getEmail());

        // Commit changes to SharedPreferences.
        return editor.commit();
    }

// 单元测试代码 

package com.fanff.unittestdemo.mockdemo;

import android.content.SharedPreferences;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import java.util.Calendar;

import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;


public class SharedPreferencesHelperTest {

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testSavePersonalInfo() {
        // Mock SharedPreferences对象作为SharedPreferencesHelper构造方法的参数
        SharedPreferences sharedPreferences = Mockito.mock(SharedPreferences.class);
        SharedPreferencesHelper sharedPreferencesHelper =
                new SharedPreferencesHelper(sharedPreferences);
        // Mock SharedPreferenceEntry对象作为savePersonalInfo方法的参数
        SharedPreferenceEntry sharedPreferenceEntry = Mockito.mock(SharedPreferenceEntry.class);
        
        // Mock SharedPreferences.Editor对象作为savePersonalInfo方法里的局部变量
        SharedPreferences.Editor editor = Mockito.mock(SharedPreferences.Editor.class);
        // Mock savePersonalInfo()方法内部的执行流程
        when(sharedPreferences.edit()).thenReturn(editor);
        when(editor.putString(anyString(), anyString())).thenReturn(editor);
        when(sharedPreferenceEntry.getDateOfBirth()).thenReturn(Calendar.getInstance());
        when(editor.putLong(anyString(), anyLong())).thenReturn(editor);
        
        // 测试savePersonalInfo()是否有调用commit
        sharedPreferencesHelper.savePersonalInfo(sharedPreferenceEntry);
        Mockito.verify(editor).commit();

    }
}

当然为了简化mock对象的初始化,可以这样写:
(1) 单元测试类定义的开头,添加 @RunWith(MockitoJUnitRunner.class) 注释。此注释可告知 Mockito 测试程序运行的框架;
(2) 在对象字段声明前添加 @Mock 注释。

package com.fanff.unittestdemo.mockdemo;

import android.content.SharedPreferences;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Calendar;

import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class SharedPreferencesHelperTest {
    
    // 如果使用@Mock注解的方式mock对象则需要在类前加 @RunWith(MockitoJUnitRunner.class)
    @Mock
    SharedPreferences sharedPreferences;
    @Mock
    SharedPreferenceEntry sharedPreferenceEntry;
    
    @Test
    public void testSavePersonalInfo() {
        SharedPreferencesHelper sharedPreferencesHelper =
                new SharedPreferencesHelper(sharedPreferences);

        SharedPreferences.Editor editor = Mockito.mock(SharedPreferences.Editor.class);

        when(sharedPreferences.edit()).thenReturn(editor);
        when(editor.putString(anyString(), anyString())).thenReturn(editor);
        when(sharedPreferenceEntry.getDateOfBirth()).thenReturn(Calendar.getInstance());
        when(editor.putLong(anyString(), anyLong())).thenReturn(editor);

        sharedPreferencesHelper.savePersonalInfo(sharedPreferenceEntry);

        Mockito.verify(editor).commit();
    }

    @Test
    public void testGetPersonalInfo() {
    }
}

-----------------------------待续--------------------------------

继续介绍mockito的其他方法,例如mock/spy的区别等。

举报

相关推荐

0 条评论