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. MSSQL服务器 电脑改名后配置

    原服务器名改为新的名字后,系统配置更新 select * from sys.sysserversexec sp_dropserver 'WIN-JVU5CSOLEPL'exec sp_addserve ...

  2. Blender插件加载研究

    目标 [x] 解析Blender插件代码加载原理, 为测试做准备 结论 采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下: _qk_locals = locals() d ...

  3. html中canvas渲染图片,并转化成base64格式保存

    最近在做一个上传头像然后保存显示的功能,因为涉及到裁剪大小和尺寸比例,所以直接上传图片再展示的话,就会出现问题,所以就想用canvas来渲染裁剪后的图片,然后转化成base64格式的图片再存储,这样取 ...

  4. Safe Area Layout Guide before iOS 9.0

    今天使用Xcode9.1重建项目,什么都没写运行报错:Safe Area Layout Guide before iOS 9.0!目前为止,不晓得原因,现记录解决方法:

  5. font使用

    font连写属性 font-style  font-variant font-weight  font-size/line-height  font-family font-size与font-fam ...

  6. 查看 Android App 的 versionCode

    有 App 源码时,可以直接查看 AndroidManifest.xml 文件. <manifest android:versionName="1.4" android:ve ...

  7. Shiny学习实践01

    Shiny是什么东东? 官方描述: Shiny is an R package that makes it easy to build interactive web apps straight fr ...

  8. VHDL之concurrent之operators

    Using operators Operators can be used to implement any combinational circuit. However, as will becom ...

  9. c# 验证码实现代码

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...

  10. openstack--memecache

    一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...