一、官网
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的区别等。