Mockito支持对变量进行注解,例如将mock对象设为测试类的属性,然后通过注解的方式@Mock来定义它,这样有利于减少重复代码,增强可读性,易于排查错误等。除了支持@Mock,Mockito支持的注解还有@Spy(监视真实的对象),@Captor(参数捕获器),@InjectMocks(mock对象自动注入)。

Annotation的初始化 
只有Annotation还不够,要让它们工作起来还需要进行初始化工作。初始化的方法为:MockitoAnnotations.initMocks(testClass)参数testClass是你所写的测试类。一般情况下在Junit4的@Before定义的方法中执行初始化工作,如下:

  1. @Before
  2. public void initMocks() {
  3. MockitoAnnotations.initMocks(this);
  4. }

除了上述的初始化的方法外,还可以使用Mockito提供的Junit Runner:MockitoJUnitRunner这样就省略了上面的步骤。

  1. @RunWith(MockitoJUnit44Runner.class)
  2. public class ExampleTest {
  3. ...
  4. }

@Mock注解 
使用@Mock注解来定义mock对象有如下的优点: 
1. 方便mock对象的创建 
2. 减少mock对象创建的重复代码 
3. 提高测试代码可读性 
4. 变量名字作为mock对象的标示,所以易于排错

@Mock注解也支持自定义name和answer属性。 
下面是官方给出的@Mock使用的例子:

  1. public class ArticleManagerTest extends SampleBaseTestCase {
  2. @Mock
  3. private ArticleCalculator calculator;
  4. @Mock(name = "dbMock")
  5. private ArticleDatabase database;
  6. @Mock(answer = RETURNS_MOCKS)
  7. private UserProvider userProvider;
  8. private ArticleManager manager;
  9. @Before
  10. public void setup() {
  11. manager = new ArticleManager(userProvider, database, calculator);
  12. }
  13. }
  14. public class SampleBaseTestCase {
  15. @Before
  16. public void initMocks() {
  17. MockitoAnnotations.initMocks(this);
  18. }
  19. }

@Spy注解 
Spy的使用方法请参阅前面的章节,在此不再赘述,下面是使用方法:

  1. public class Test{
  2. @Spy
  3. Foo spyOnFoo = new Foo();
  4. @Before
  5. public void init(){
  6. MockitoAnnotations.initMocks(this);
  7. }
  8. ...
  9. }

@Captor注解 
@Captor是参数捕获器的注解,有关用法见前章,通过注解的方式也可以更便捷的对它进行定义。使用例子如下:

  1. public class Test {
  2. @Captor
  3. ArgumentCaptor<AsyncCallback<Foo>> captor;
  4. @Before
  5. public void init() {
  6. MockitoAnnotations.initMocks(this);
  7. }
  8. @Test
  9. public void shouldDoSomethingUseful() {
  10. // ...
  11. verify(mock.doStuff(captor.capture()));
  12. assertEquals("foo", captor.getValue());
  13. }
  14. }

@InjectMocks注解 
通过这个注解,可实现自动注入mock对象。当前版本只支持setter的方式进行注入,Mockito首先尝试类型注入,如果有多个类型相同的mock对象,那么它会根据名称进行注入。当注入失败的时候Mockito不会抛出任何异常,所以你可能需要手动去验证它的安全性。 
例:

  1. @RunWith(MockitoJUnit44Runner.class)
  2. public class ArticleManagerTest {
  3. @Mock
  4. private ArticleCalculator calculator;
  5. @Mock
  6. private ArticleDatabase database;
  7. @Spy
  8. private UserProvider userProvider = new ConsumerUserProvider();
  9. @InjectMocks
  10. private ArticleManager manager = new ArticleManager();
  11. @Test
  12. public void shouldDoSomething() {
  13. manager.initiateArticle();
  14. verify(database).addListener(any(ArticleListener.class));
  15. }
  16. }

上例中,ArticleDatabase是ArticleManager的一个属性,由于ArticleManager是注解@InjectMocks标注的,所以会根据类型自动调用它的setter方法为它设置ArticleDatabase。 

学习Mockito - Mockito对Annotation的支持的更多相关文章

  1. SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问

    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672

  2. hibernate学习三(使用Annotation,注解)

    一.新建一个工程hibernate_02_HelloWorld_Annotation(复制01工程并重命名); 二.新建一个实体类teacher.java,数据库中新建teacher表; import ...

  3. Spring学习笔记之三----基于Annotation的Spring IOC配置

    使用Annotation 来创建Bean有两种方式 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bea ...

  4. Spring 4 官方文档学习(十四)WebSocket支持

    个人提示:如果需要用到页面推送,高频且要低延迟,WebSocket无疑是最佳选择.否则还是轮询和long polling吧. 做了一个小demo放在码云上,有兴趣的可以看一下,简单易懂:websock ...

  5. 菜鸟学习Spring——60s使用annotation实现简单AOP

    一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...

  6. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  7. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

  8. JavaSE学习笔记--Item1 注解Annotation

    从 JDK 5.0 開始, Java 添加了对元数据(MetaData) 的支持, 也就是 Annotation(注解). 什么是Annotation,以及注解的作用? 三个主要的 Annotatio ...

  9. [WebView学习之二]:使用Web Apps 支持不同分辨率屏

    上一篇我们学习了(1.[WebView学习之中的一个]:Web Apps简单介绍),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jiangqq),转 ...

随机推荐

  1. springboot创建项目

    Springboot作为轻量级快速开发受到无数java人的青睐,Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过 ...

  2. 【IDEA】(4)---很好用的DEBUG功能

    IDEA-DEBUG功能 一.常用快捷键 快捷键并不是完全一样的,我这边是MAC安装的IDEA, 这边最主要还是知道DEBUG时常用的功能. 1.快捷键 F7 #进入下一步,如果当前行是一个方法,则进 ...

  3. Java数据的基本类型

    整数类型: byte:8位(1个字节) eg:byte x=2,y: 错误实例:byte b:b=b+3:   其中b=b+3是错误的,应该是b=(byte)(b+3)强制转换: short:16位( ...

  4. 装X数学:高雅的数学表示

    采用高雅的数学描述 转自于:研究生之路怎么走?       高雅的数学描述会提高你论文的等级和加强评审人对你基础功底的认可.例如泛函分析.集合.测度.度量空间和拓扑空间.现代代数.微分几何等数学方面的 ...

  5. 参加EMCL感想

    ECML,全名为欧洲机器学习会议,European Conference on Machine Learning 原文链接:http://blog.sina.com.cn/s/blog_59388e2 ...

  6. texi格式文件的读取

    使用texi2html可以将texi格式的文件转换成html格式的文件. sudo apt-get install texi2html 在对应目录下 texi2html filename.texi 或 ...

  7. 创建一个类Person

    创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!").交朋友(addFriend ...

  8. 西门子Step7中DB块结构导出

    Step7 通过变量表可以导出内存M地址和I,Q,T,C地址的变量,以及DB块的名称.怎么导出DB块的内部结构结构呢.即如何导出结构内的定义呢? 可以通过“选择某个DB块”,通过菜单命令“File&g ...

  9. 【sqli-labs】 less16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

    ' or 1=1# -->失败 1" or 1=1# -->失败 1') or 1=1# -->失败 1") or 1=1# -->成功 判断为双引号变形注 ...

  10. cocos creator 底部按钮touch延迟

    cocos论坛里有这个问题: http://forum.cocos.com/t/ios-touchstart-bug/63367我的引擎版本:"engine_version": & ...