安卓中的单元测试

单元测试在安卓开发里,普遍被开发者所忽略。今天就讲讲这块吧!

单元测试用的好,开发的效率其实会提高很多。

在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。这是维基百科里关于单元测试的介绍。

而android中的单元测试基于JUnit,可分为本地测试和instrumented测试,在项目中对应

module-name/src/test/java/.
  该目录下的代码运行在本地JVM上,其优点是速度快,不需要设备或模拟器的支持,但是无法直接运行含有android系统API引用的测试代码。
  
module-name/src/androidTest/java/.
  该目录下的测试代码需要运行在android设备或模拟器下面,因此可以使用android系统的API,速度较慢。

另外就是三方的测试框架了

常用的android测试框架有以下几个:

JUnit4
AndroidJUnitRunner
Mockito
Espresso

这里说书Mockito吧,其他的没用过,可以自行百度学习。

Mocktio 的GitHub地址如下:

https://github.com/mockito/mockito

Mock对象,模拟控制其方法返回值,监控其方法的调用等。

首先添加依赖

testImplementation ‘org.mockito:mockito-core:2.19.0’

Example

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.
;
import static org.mockito.internal.verification.VerificationModeFactory.atLeast;

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

@Mock
MyClass test;

@Test
public void mockitoTestExample() throws Exception {

    //可是使用注解@Mock替代
    //MyClass test = mock(MyClass.class);

    // 当调用test.getUniqueId()的时候返回43
    when(test.getUniqueId()).thenReturn(18);
    // 当调用test.compareTo()传入任意的Int值都返回43
    when(test.compareTo(anyInt())).thenReturn(18);

    // 当调用test.close()的时候,抛NullPointerException异常
    doThrow(new NullPointerException()).when(test).close();
    // 当调用test.execute()的时候,什么都不做
    doNothing().when(test).execute();

    assertThat(test.getUniqueId(), is(18));
    // 验证是否调用了1次test.getUniqueId()
    verify(test, times(1)).getUniqueId();
    // 验证是否没有调用过test.getUniqueId()
    verify(test, never()).getUniqueId();
    // 验证是否至少调用过2次test.getUniqueId()
    verify(test, atLeast(2)).getUniqueId();
    // 验证是否最多调用过3次test.getUniqueId()
    verify(test, atMost(3)).getUniqueId();
    // 验证是否这样调用过:test.query("test string")
    verify(test).query("test string");
    // 通过Mockito.spy() 封装List对象并返回将其mock的spy对象
    List list = new LinkedList();
    List spy = spy(list);
    //指定spy.get(0)返回"Jdqm"
    doReturn("Jdqm").when(spy).get(0);
    assertEquals("Jdqm", spy.get(0));
}

}

使用Mock的目的主要有以下两点:
1,验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等。
2,指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作。

Mockito是优秀的mock框架之一,使用该框架可以使mock的操作更加简单,直观。

你可能感兴趣的:(Android,Android单元测试,安卓单元测试)