首页 > 其他分享 >基于Mockito的Android应用单元测试

基于Mockito的Android应用单元测试

时间:2023-01-06 10:36:55浏览次数:46  
标签:Person public Mockito 单元测试 Custom person Android class Mock


  • Mockito是java 开发中常用的Mock库,在Android应用单元测试中比较常见
  • 在实际的单元测试中,测试的类之间会有或多或少的耦合,导致无法顺利的进行测试,这是就可以使用Mockito,该库可以模拟Mock对象,体换原先以来的真是独享,这样就可以避免外部影响,只测试本类
  • 在Android Studio中添加依赖:
dependencies {
testImplementation 'org.mockito:mockito-core:2.11.0'
androidTestImplementation 'org.mockito:mockito-android:2.11.0'
}
  • 普通方法:
@Testpublic void testMock(){        
Person person= mock(Person.class);
assertNotNull(person);
}
  • 注解方法
public class MockitoTest{    
@Mock
Person person;
@Before
public void setUp(){
//初始化
MockitoAnnotations.initMocks(this);
}
@Test
public void testIsNotNull(){
assertNotNull(person);
}
}
  • 运行器方法
@RunWith(MockitoJUnitRunner.class)public class MckitoTest {   
@Mock
Person person;
@Test
public void testMockito(){
assertNotNull(person);
}
}
  • MockitoRule方法:
public class MckitoTest {    
@Mock
Person person;
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Test
public void testMockito(){
assertNotNull(person);
}
}
  • Mockito:对Mock对象进行操作的方法
  • Mock出的对象中非void方法都将返回默认值,比如int方法将返回0,对象方法将返回null等,而void方 法将什么都不
  • 要改变Mock对象的默认行为,需要通过对Mock对象进行操作来完成‘
  • when thenReturn:
//Mockito对对象的操作
//when调用某个方法,thenReturn预期返回值
Comparable<Integer> comparable = mock(Comparable.class);
when(comparable.compareTo(anyInt())).thenReturn(-1);
assertEquals(-1, comparable.compareTo(3));
Comparable<Person> comparable1 = mock(Comparable.class);
when(comparable1.compareTo(isA(Person.class))).thenReturn(1);
assertEquals(1, comparable1.compareTo(new Person()));
Iterator<String> i = mock(Iterator.class);
when(i.next()).thenReturn("Mockito").thenReturn("mocks");
String result = i.next() + " " +i.next();
assertEquals("Mockito mocks",result);
  • when thenThrow:
Properties properties  = mock(Properties.class);
Person person= new Person();when(properties.get("wjx")).thenThrow(new IllegalArgumentException("error"));
try{
properties.get("wjx");
fail("is missed");
}catch (IllegalArgumentException e){
e.printStackTrace();
}
  • 验证(verify):
  • 是Mock区别于其他TestDouble的特别之处
  • 检验方法是否被正确调用过,调用情况等
Person person = mock(Person.class);
when(person.getName()).thenReturn("wjx");
person.setName("wjx");
person.getName();

//验证参数
verify(person).setName(ArgumentMatchers.eq("wjx"));

//验证执行次数
verify(person, times(1)).getName();
  • 但是Mockito也存在一些限制(不能Mock):
  • 下面是可以在桩上调用的方法
  • Static class
  • Final class
  • Anonymous class
  • Primitive type
when(daoMock.save(any(Custom.class))).thenReturn(new Custom());
final Custom custom = new Custom();
assertThat(service.addCustom(custom), is(notNullValue()));
daoMock daoMock = mock(com.example.adminstator.myapplication.whenThenAnswer.daoMock.class);
when(daoMock.save(any(Custom.class))).thenAnswer(new Answer<Custom>() {
@Override
public Custom answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
if(arguments!=null&&arguments.length>0 &&arguments[0]!=null){
Custom custom1 = (Custom)arguments[0];
custom1.setId(1);
return custom1;
}
return null;
}
});
Custom custom1 = new Custom();assertThat(service.addCustom(custom1), is(notNullValue()));


标签:Person,public,Mockito,单元测试,Custom,person,Android,class,Mock
From: https://blog.51cto.com/u_13987312/5992399

相关文章

  • Android文字与画布(二)
    画布:Canvas平移:translate()使用来实现画布平移的,向右是X轴正方向,向下是Y轴正方向,画布的原点是(0,0)平移后的画布的左上角是新的坐标原点voidtranslate(floatdx,floatdy)@Over......
  • Android笔记--Android studio里面打开数据库详解
    1、下载DatabaseNavigator插件,然后需要重启Androidstudio2、然后会总界面这里。出现这样一个图标然后选中DatabaseBrower:3、弹出这样一个界面然后点击绿色+号,选......
  • Android笔记--报错AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY in "cre
    问题描述每次一运行,APP程序必定闪退,百度了发现,闪退问题绝大多数就跟sql语句有关;看到控制台报出这样的错误:百度发现,我忘记了最初的知识点:在表里面,自动递增是在数据类型......
  • android之调用webservice实现图片上传
    最近boss要求做android客户端的图片上传和下载,就是调用服务器的webservice接口,实现从android上传图片到服务器,然后从服务器下载图片到android客户端。需求下来......
  • android SQLite使用SQLiteOpenHelper类对数据库进行操作
    一、SQLite介绍 SQLite是android内置的一个很小的关系型数据库。 SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息。 博客中有一篇有稍......
  • Android JNI GetMethodID中sig参数说明
    GetMethodID中sig参数是对函数的签名,也可以说标识,具体的格式为:(函数参数)返回值。方法签名中用大写的字母对应了java的基本数据类型:Z->booleanB->byteC->charS-......
  • 【Android】无法通过drawable下的selector类型改变背景颜色?
    举例我在darwable目录下创建了selector文件,并设置了如下内容<?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="http://schemas.android.com/apk/res/andr......
  • 常用的android弹出对话框
     newAlertDialog.Builder(self).setTitle("标题").setMessage("简单消息框").setPositiveButton("确定",null)......
  • 米尔国产T507-H开发板之Android SDK说明
        安卓系统作为目前世界上最受欢迎的移动操作系统,它可以在大量的设备上使用,它正在接管平板电脑、汽车、智能电视、可穿戴设备、家用电器、游戏机等市场,它为嵌入式平台......
  • Android 如何 简单的添加 启动页 SplashScreen
    1.在AndroidApp启动中,为了体验优化,各大App都是有添加启动页的,比较土的方法就是直接弄个loadingActivity,充当启动页,在启动初始化相关工作做完以后,再跳......