Mockito,测试框架,语法简单,功能强大!
静态、私有、构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito.

测试对像:ArticleManager

ArticleManager 类

public class ArticleManager {
void setDatabase(ArticleDatabase database) {... }
String get(String val){
database.get(val);
}
String add(String val){
database.set(val);
}
}

ArticleDatabase 类

public class ArticleDatabase {
String get(String val){...}
String add(String val){...}
}

注解

@Mock

创建Mock对像

@Mock
private ArticleDatabase ds;

实例ds是一个虚拟对像,ds对像本身的所有方法返回值都为Null。

@InjectMocks

@InjectMocks
private ArticleManager articleManager;

将现有Mock对像(ds)注入到articleManager,支持方法包括constructor, setter, property 和 Spring的@Autowired !

@Captor

参数调用截取器

//定义@Captor,如果要获取多个参数, 需要定义多个@Captor
@Captor
private ArgumentCaptor<String> argumentString;
articleManager.add("content");
verify(ds, times(1)).add(argumentString.capture());
//打印参数值
logger.debug(argumentString.getValue());

@Spy

Mock类的部分真实或定制后调用。没有定制的方法就调用真实的方法。

@Spy
private ArticleManager articleManager2;
//定制方法,这个地方用`when`还会调用真实的方法后返回定制结果
//见:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html
doReturn("0").when(articleManager2).get(0);
articleManager2.get(0);
verify(articleManager2).get(0);
//调用真实的方法
articleManager2.get(1)
verify(articleManager2).get(1);

@Spy真实调用也可以用@Mock对像thenCallRealMethod方法调用:

when(articleManager2.get(2)).thenCallRealMethod();

Stubbing

特别制定Mock对像某方法的返回值、类型或异常等,默认是Null,

when(ds.get(0)).thenReturn("first");
when(ds.get(1)).thenThrow(new RuntimeException());

verify

对某方法返回结果的校验,包括调用次数,返回值等

articleManager.add("one");
verify(ds).add("one");

参考:@Captor

模糊匹配

在Stubbing或verify里可用模糊匹配来适配多种情况的调用,Mockito在包org.mockito.Matchers下提供有anyString(), anyInt()或者直接anyObject()等大量模糊匹配函数,如果有需要还可自己写,实现(org.hamcrest.Matcher)。 例:

when(articleManager.get(anyString())).toReturn("element");
System.out.println(articleManager.get("1"));
verify(articleManager).get(anyString());

在使用校验函数verify时,参数如果有模糊匹配则所有参数都要用模糊匹配,如:

//正确的写法:
verify(mock).articleManager(anyInt(), anyString(), eq("third argument"));
//错误用法:
verify(mock).articleManager(anyInt(), anyString(), "third argument");

更多模糊匹配函数请参考:http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/Matchers.html

参考地址:

mockito home
mockito docs

测试框架Mockito使用笔记的更多相关文章

  1. mock测试框架Mockito

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  2. Mock测试框架(Mockito为例)

    在做单元测试的时候,有的时候用到的一些类,我们构造起来不是那么容易,比如HttpRequest,或者说某个Service依赖到了某个Dao,想构造service还得先构造dao,这些外部对象构造起来比 ...

  3. Java测试框架Mockito源码分析

    1.Mockito简介 测试驱动的开发(Test Driven Design, TDD)要求我们先写单元测试,再写实现代码.在写单元测试的过程中,一个很普遍的问题是,要测试的类会有很多依赖,这些依赖的 ...

  4. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  5. 使用强大的 Mockito 测试框架来测试你的代码

    原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...

  6. 用maven搭建 testNG+PowerMock+Mockito测试框架

    单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试框架,Junit是使用最广泛的测试框架,有兴趣的话自己baidu一下. testNG基于Junit和 ...

  7. Robolectric测试框架使用笔记

    1. 概述 Robolectric(http://robolectric.org/)是一款支持在桌面JVM模拟Android环境的测试框架,通过shadow包下的类来截取view.activity等类 ...

  8. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:测试SSH框架分层整合及验证事务是否有效

    测试框架分层的整合 HibernateTemplate 和 HibernateDaoSupport,这两个类是 Spring 为整合 Hibernate3 提供的两个工具类. HibernateTem ...

  9. Android开源测试框架学习

    近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java ...

随机推荐

  1. COM编程概述

    所谓COM,英文为Componet Object Model,中文为组件对象模型(其实这种解释只有在考试卷上才具有一点实际意义). [1]为什么需要COM? COM是为了解决OLE问题而产生的.COM ...

  2. scala特质

    package com.ming.test /** * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的 */ /** * 定义一个日志的特质 */ tra ...

  3. React笔记_(6)_react语法5

    react的版本 目前主要的react有 ES5,ES6.也有ES5和ES6混合编写的.比较混乱. react官方提倡用ES6. 说到这里,就需要提到一个概念--mixin mixin在es6中被摒弃 ...

  4. Android 常用工具类之LogUtil,可以定位到代码行,双击跳转

    package cn.utils; import android.util.Log; public class LogUtils { public static boolean isDebug = t ...

  5. Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义【转】

    转自:http://www.cnblogs.com/kaituorensheng/p/4002697.html 1 2 3 4 5 6 7 8 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 ...

  6. 严重: IOException while loading persisted sessions: java.io.EOFException

    tomcat在启动时出现如下异常问题: 严重: IOException while loading persisted sessions: java.io.EOFException 严重: Excep ...

  7. sqlite3把字段为int32(用c++的time(nullptr)获取的)的秒数显示为年月日时分秒

    select id, type, msg, datetime(updateTime, 'unixepoch', 'localtime') from ServerLog

  8. JavaScript脚本语言基础(三)

    导读: 数学对象(Math) 数组对象(Array) 字符串对象(String) 日期对象(Date) js对象是属性和方法的集合.JavaScript中的所有事物都是对象,如:字符串.数值.数组.函 ...

  9. app缓存设计-文件缓存

    采用缓存,可以进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不需要实时更新,哪怕是3-5分钟的延迟也是可以采用缓 ...

  10. HDU 4709:Herding

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...