Android单元测试之Mockito的使用

Mockito最大的特点是模拟依赖,

添加依赖

testImplementation "org.mockito:mockito-core:2.11.0"

1. 四种Mock方式
  • 使用mock方法

     @Test
      public void test(){
           Calculator calculator=mock(Calculator.class);//使用mock方法
           Assert.assertNotNull(calculator);
       }
    
  • 使用@Mock注解

    @Mock
    Calculator calculator;
    
    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this);//初始化
    }
    
    @Test
    public void test1(){
        Assert.assertNotNull(calculator);
    }
    

    在使用注解之前要调用MockitoAnnotations.initMocks(this);来初始化mock

  • 运行器方式

    @RunWith(MockitoJUnitRunner.class)//使用MockitoJUnitRunner运行器
    public class MockTest {
        @Mock
        Calculator calculator;
        @Test
        public void test2(){
             Assert.assertNotNull(calculator);
        }
    }
    
  • MockitoRule方法

    @Mock
    Calculator calculator;
    
    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();
    
    @Test
    public void test3(){
        Assert.assertNotNull(calculator);
    }
    
2. 常用打桩方法

打桩的意思是对mock出来的对象进行操作,比如模拟返回值

方法名 方法描述
thenReturn(T value) 设置要返回的值
thenThrow(Throwable… throwables) thenThrow(Throwable… throwables)
thenAnswer(Answer<?> answer) 对结果进行拦截
doReturn(Object toBeReturned) 提前设置要返回的值
doThrow(Throwable… toBeThrown) 提前设置要抛出的异常
doAnswer(Answer answer) 提前对结果进行拦截
doCallRealMethod() 调用某一个方法的真实实现
doNothing() 设置void方法什么也不做

比如
Calculator文件有方法

public String getMyName(){
        return "leory";
    }

通过单元测试可以模拟更改返回值

when(calculator.getMyName()).thenReturn("hello,leory");
System.out.print(calculator.getMyName());

输出hello,leory

doReturn主要是对无法用thenReturn的情况,比如返回值void

   doReturn("小明").when(calculator).getMyName();
   System.out.print(calculator.getMyName());

输出 小明

3. 常用验证方法

上面所说的都是状态测试,所关心的是返回结果,但如果关心方法是否被正确的参数调用过,这时候就要调用验证方法了

通过verify(T mock)验证发生的某些行为 。

方法名 方法描述
after(long millis) 一段时间后再验证
timeout(long millis) 验证方法执行是否超时
atLeast(int minNumberOfInvocations) 至少执行多少次
atMost(int maxNumberOfInvocations) 至多进行n次验证
description(String description) 验证失败时输出的内容
times(int wantedNumberOfInvocations) 验证调用方法的次数
never() 验证交互没有发生,相当于times(0)
only() 验证方法只被调用一次,相当于times(1)
4. 常用参数匹配器
方法名 方法描述
anyObject() 匹配任何对象
any(Class<T> type) 与anyObject()一样
any() 与anyObject()一样
anyBoolean() 匹配任何boolean和非空Boolean
anyByte() 匹配任何byte和非空Byte
anyCollection() 匹配任何非空Collection
anyDouble() 匹配任何double和非空Double
anyFloat() 匹配任何double和非空Double
anyInt() 匹配任何int和非空Integer
anyList() 匹配任何非空List
anyLong() 匹配任何long和非空Long
anyMap() 匹配任何非空Map
anyString() 匹配任何非空String
contains(String substring) 参数包含给定的substring字符串
argThat(ArgumentMatcher <T> matcher) 创建自定义的参数匹配模式

举个栗子
参数为aynInt()

  @Test
  public void test5(){
       when(calculator.add(anyInt(),anyInt())).thenReturn(100);
       Assert.assertEquals(100,calculator.add(1,2));
  }

参数包含某个string

 @Test
 public void test5(){
       when(calculator.judgeInput(contains("朱"))).thenReturn("朱");
       Assert.assertEquals("小朱",calculator.judgeInput("小朱"));

 }
5. 其他方法
方法名 方法描述
reset(T … mocks) 重置Mock
spy(Class<T> classToSpy) 实现调用真实对象的实现
inOrder(Object… mocks) 验证执行顺序
@InjectMocks注解 自动将模拟对象注入到被测试对象中

参考 Android单元测试(二):Mockito框架的使用

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试。 如果你不熟悉 JUnit,请查看下...
    会飞的大象_阅读 2,818评论 0赞 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,197评论 19赞 139
  • 什么是单元测试 在计算机编程中,单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最...
    HelloCsl阅读 11,139评论 1赞 46
  • 一.基本介绍 背景: 目前处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单元...
    anmi7阅读 2,224评论 0赞 6
  • 在博客Android单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简...
    水木飞雪阅读 9,830评论 4赞 18

友情链接更多精彩内容