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. CSS制作简单loading动画

    曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来.比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就 ...

  2. 《java数据结构与算法》系列之“开篇”

    大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...

  3. css3基础篇一

    CSS3 选择器 选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id=&quo ...

  4. OAuth四种模式

    授权码模式(authorization code)----适用于网站服务端去oauth服务端申请授权 简化模式(implicit)----没有服务端,js+html页面去oauth服务端申请授权 密码 ...

  5. POJ_2063_完全背包

    Investment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10090   Accepted: 3540 Descr ...

  6. Scala语言学习笔记——方法、函数及异常

    1.Scala 方法及函数区别 ① Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 ② Scal ...

  7. 用doxygen风格注释代码生成文档

    目录 用doxygen风格注释代码生成文档 1. 说明 2. 具体操作 2.1 生成头部注释 2.2 安装doxygen 2.3 工程配置 3. 总结 用doxygen风格注释代码生成文档 1. 说明 ...

  8. windows系统通过命令行查看配件的详细信息

    今天我在工作中遇到这样一个问题:客户服务器用的是win 2012系统,不打开机箱,不借助其他类似于鲁大师软件的情况下查看内存条的详细信息 刚开始的时候我通过systeminfo命令,只能查出来总的内存 ...

  9. rsync增量同步标志位详细解释

    rsync非常强大,下面是我用rsync做目录备份时用到的参数: rsync -ruPi -plEt /home/op/photo/ /remote_backup/photo/ --dry-run - ...

  10. JS控制全屏,监听退出全屏事件

    实现方案 //进入全屏 function requestFullScreen(de) { if(de.requestFullscreen){ //W3C de.requestFullscreen(); ...