mockito 静态

如何通过在基于Java 8的项目中删除静态导入来简化Mockito的使用。

基本原理

Mockito API基于(BDD)Mockito类中聚集的静态方法(大部分),然后进行非常流畅的链接方法调用。 可以使用模拟/间谍/给定/然后/验证静态方法来启动模拟创建,存根和呼叫验证:

@Test
public void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = BDDMockito.spy(TacticalStation.class);BDDMockito.willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenBDDMockito.then(tsSpy).should(BDDMockito.times(2)).fireTorpedo(2);
}

非常详细,但是从Java 5开始,可以使用静态导入来简化代码,但是要付出额外的静态导入的代价:

import static org.mockito.BDDMockito.then;
import static org.mockito.BDDMockito.willDoNothing;
import static org.mockito.BDDMockito.spy;
import static org.mockito.BDDMockito.times;
(...)@Test
public void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = spy(TacticalStation.class);willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenthen(tsSpy).should(times(2)).fireTorpedo(2);
}

导入可以隐藏在IDE中,通常不会造成太大影响。 然而,为了能够只写一个没有类的方法名(例如, mock(TacticalStation.class) ),还是需要按ALT-ENTER(在IntelliJ IDEA中),以在第一次使用给定方法时添加每个静态导入。测试班。 在Eclipse中情况更糟,在Eclipse中, 需要更早地将BDDMockito添加到“ Content Assist”中的“ Favorites”中,以使其由IDE建议。 Eclipse的人可能会说“您只需做一次”,但是正如我在测试/ TDD培训中所经历的那样,它使Mockito的学习(使用)曲线变得更加陡峭。

当然,有一些技巧,例如默认情况下对Mockito类使用星号导入以减少所需的击键次数,但是如果您在项目中使用Java 8(希望是您的大多数),则有一种更简单的方法来应对它。

静态无进口方式

Mockito-Java8 2.0.0(及其对应的Mockito 1.10.x –版本1.0.0)引入了一组接口,这些接口提供了Mockito API的所有方法。 通过在测试类中“实现”它们,所有这些方法都可以在书面测试中自动直接访问:

//no static imports needed!public class SpaceShipTest implements WithBDDMockito {@Testpublic void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = spy(TacticalStation.class);willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenthen(tsSpy).should(times(2)).fireTorpedo(2);}
}

该代码看起来与上一片段完全相同,但是不需要进行任何静态导入(除了WithBDDMockito本身的常规导入之外)。

WithBDDMockito接口实现非常简单。 所有方法都是默认方法,它们仅委托给BDDMockito类中的适当静态方法。

default <T> BDDMockito.BDDMyOngoingStubbing<T> given(T methodCall) {return BDDMockito.given(methodCall);
}

Mockito的味道

Mockito方法由3个基本接口提供,它们是给定方法集的入口点:

  • WithBDDMockito –以BDD样式存根/ WithBDDMockito API(还提供经典API)。
  • WithMockito –经典的存根/ WithMockito API
  • WithAdditionalMatchers –其他Mokcito匹配器(基本帐户包含在With(BDD)Mockito中)

摘要

Java 8为如何以更紧凑和可读的方式编写(测试)代码开辟了新的机遇。 静态导入免费的Mockito代码可以稍微简化编写测试,但是Mockito-Java8中已经提供了更多功能,Mockito 3.0中甚至包含了更多功能(必须以非向后兼容的方式修改Mokcito内部的功能) 。 过多地了解如何重构代码/项目以从Java 8中受益,您可以看到我的简短演示“ Java 8为测试带来了力量!” ( 幻灯片和视频 )。

Mockito-Java8 2.0.0-beta(适用于Mockito> = 2.0.22-beta)和1.0.0-beta(适用于Mockito 1.10.x和Mockito 2的早期beta)可通过Maven Central获得 。 这些版本应该相当稳定,但是我希望获得更多有关此新功能的反馈,因此将其标记为Beta。 可以在项目网页上找到更多详细信息。

致谢 。 这个想法最初是David Gageot( Infinitest的幕后人物)在他的一篇博客文章中提出的 。

翻译自: https://www.javacodegeeks.com/2015/12/using-mockito-without-static-imports-java-8.html

mockito 静态

mockito 静态_在Java 8中使用不带静态导入的Mockito相关推荐

  1. 在Java 8中使用不带静态导入的Mockito

    如何通过在基于Java 8的项目中删除静态导入来简化Mockito的使用. 基本原理 Mockito API基于(BDD)Mockito类中聚集的静态方法(大部分),然后进行非常流畅的链接方法调用. ...

  2. java 应用分模块_在Java 11中创建一个简单的模块化应用教程

    模块化编程使人们能够将代码组织成独立的,有凝聚力的模块,这些模块可以组合在一起以实现所需的功能. 本文摘自Nick Samoylov和Mohamed Sanaulla撰写的一本名为Java 11 Co ...

  3. java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

  4. java定义常量语法错误的是_在Java接口中定义常量,下面语法错误的是( )_学小易找答案...

    [单选题]Why did Ben's emotions change so much? [判断题]Write the title in the middle of the first line. [单 ...

  5. java classpath 目录_关于JAVA项目中CLASSPATH路径详解

    在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的java文件中 ...

  6. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  7. java treeset 删除_删除Java TreeSet中的最高元素

    要删除最高元素,请使用pollLast()方法. 创建一个TreeSet并向其中添加元素-TreeSet tSet = new TreeSet(); tSet.add("78"); ...

  8. java中打开文件显示_从java程序中打开任何文件

    在 java中打开文件似乎有点棘手 – 对于.txt文件,必须将File对象与Scanner或BufferedReader对象结合使用 – 对于图像IO,必须使用 ImageIcon类 – 如果要打开 ...

  9. java下列语句正确的是_下列Java语句中,不正确的一项是( )。

    [多选题]装卸搬运机械具有( )功能 [判断题]char[] str="abcdefgh"; ( ) [单选题]7.关于内部类,下列说法不正确的是( ). [单选题]下列关于Jav ...

最新文章

  1. Winform中使用NPOI实现Excel导入并赋值给DataTable
  2. Cpp 对象模型探索 / 程序转化语义
  3. Unity TA总监王靖:Unity如何实现美术画质升级?
  4. mysql批量修改字段字符集_MySQL字符集修改实战教程
  5. PHP 直接在共享内存中存储数据集
  6. “围棋人机大战”唯一人类的胜利记录将被制作成NFT进行拍卖
  7. python的scrapy爬虫模块间进行传参_Python爬虫Scrapy框架之请求传参合日志等级
  8. 这一刻只想好好做个平凡的人
  9. 2016版excel_巧用这些Excel大神技巧,半小时做完一天工作,办公室女神惊呆了!...
  10. ArcGIS教程 - 1 绪论
  11. hook read_chk 导致dex2oat进程 abort
  12. 单片机无线通信学习笔记
  13. 强大便携的多标签文件管理器 XYplorer Pro 21.60 中文版
  14. 23行代码下载逆水寒壁纸图片
  15. 7-95 深入虎穴 (树的深搜)
  16. AngularJs错误
  17. 洛谷 CF7E Defining Macros 题解
  18. 流利说硅谷AI Lab负责人刘扬:语言学习产品如何在技术上保持优势?
  19. VMware(威睿)后端开发笔试题总结
  20. LeetCode1621:顺时针打印矩阵

热门文章

  1. 内部设计师揭秘!王者峡谷中竟有隐藏的c++代码??!!腾讯已经炸了!!!
  2. CF1137F-Matches Are Not a Child‘s Play【LCT】
  3. P4296-[AHOI2007]密码箱【数论】
  4. P3651-展翅翱翔之时【贪心,环套树】
  5. 【图论】【Kosaraju】刻录光盘(ssl 2344)
  6. [XSY] 绿色(圆方树、树形DP、树上差分)
  7. SpringBoot使用日志
  8. 漫画:什么是鸡尾酒排序
  9. baiduTemplate / artTemplate
  10. Java并发包:ConcurrentMap