Jmockit教程(各种整理的心得)

  1. 模拟类型和实例
  2. 期望
  3. 记录重放验证模型
  4. 经常与严格的期望
    严格和非严格Mock

记录期望的结果
将调用与特定实例匹配
可注入的模拟实例
声明多个模拟实例
使用给定构造函数创建的实例
参数值的灵活匹配
使用“任何”字段进行参数匹配
使用“with”方法进行参数匹配
使用null值匹配任意对象引用
匹配值通过一个可变参数参数传递
指定调用计数约束
显式验证
验证调用从未发生
验证按顺序
部分有序验证
完全验证
按顺序完全验证
限制要完全验证的模拟类型集
验证是否未发生调用
验证不应发生的未指定调用

捕获调用参数以进行验证从单个调用捕获参数
从多个调用捕获参数
捕获新实例

代理:指定自定义结果
级联模拟级联静态工厂方法
级联自返回法

部分嘲笑
捕获实现类和实例模拟未指定的实现类
对于未来实例指定行为

实例化和注入测试类

Paste_Image.png

在JMockit库, Expectations(期望)API提供了使用自动化的开发人员测试mock的丰富的支持。 当mock使用,在测试的重点是代码的被测行为,如通过其与其他类型它取决于相互作用表达。 嘲笑通常以分离的单元测试的结构,其中,受测试的单元中隔离行使从其它单元的执行它取决于使用。 通常,行为的单位体现在单个类中,但也可以考虑一整套强相关的类作为单个单元用于单元测试的目的(通常情况下,当我们有一个中央公共类与一个或多个帮助类,可能package-private); 一般来说,个别方法不应被视为独立的单位。

严格的单元测试,但是,这不是一个推荐的方法; 一个单元测试不应该试图Mock每一个依赖。 mock最好使用适度; Mock偶尔也有用于创建集成测试,一些特定的依赖关系不实现容易使用,或当试图创建测试的复杂依赖的情况下,一个良好的Mock,可以大大方便测试。
两个类之间的相互依赖总是通过一个方法或构造函数调用的形式。 从被测试类到其依赖的调用集合以及它们之间传递的参数和返回值定义了该特定类的测试感兴趣的行为。 此外,给定的测试可能需要验证多次调用之间的执行的相对顺序。


Mock类型和实例

从依赖的测试代码调用的方法和构造函数是Mock的目标。 Mocking提供了我们需要的机制,以便将被测试的代码与(一些)依赖关系隔离开来。 我们指定特定的依赖关系是通过声明适当的模拟域和/或模拟参数被嘲笑为一个给定的测试(或测试); mock字段声明为测试类的注释实例字段,而mock参数声明为测试方法的注释参数。 要模拟的依赖关系的类型将是模拟字段或参数的类型。 这样的类型可以是任何类型的引用类型的:interface,class(包括abstract和final的),注释,或enum。
默认情况下, 所有非private (即是包括任何方法static , final ,还是native )的Mock对象的将被Mock为测试的持续时间。 如果声明Mocked的是一个类,它所有的超类的,但不包括java.lang.Object,都将被Mocked, 因此,继承的方法也会自动被Mock。 另外一种的情况下,所有的非的private
构造函数将被Mock。
当一个方法或构造器被Mock时,在测试期间发生的调用在它的原始实现代码中将不会被执行。 相反,调用将被重定向到JMockit,所以它可以以显式或隐式指定的测试方式处理。
以下示例测试框架用作对mock字段和mock参数的声明以及它们在测试代码中通常使用的方式的基本说明。 在本博客中,我们使用了很多这样的代码片段,其中粗体字的部分是当前的重点解释。


// "Dependency" is mocked for all tests in this test class. 
// The "mockInstance" field holds a mocked instance automatically created for use in each test. 
@Mocked Dependency mockInstance ; 
@Test 
public void doBusinessOperationXyz(@Mocked final AnotherDependency anotherMock ) {
 ... 
new Expectations() {{ 
// an "expectation block" ... 
// Record an expectation, with a given value to be returned: 
mockInstance .mockedMethod(...); 
result = 123; ... }}; ... 
// Call the code under test. ... 
new Verifications() {{ 
// a "verification block" 
// Verifies an expected invocation: 

anotherMock .save(any); times = 1; }}; ... }

对于在测试方法中声明的mock参数,声明类型的实例将由JMockit自动创建,并在JUnit / TestNG测试运行器执行测试方法时传递; 因此,参数值将永远不会null。 对于模拟领域,只要它不是final,声明类型的实例会自动JMockit创建并分配到领域中。

有一些不同的注释可用于声明模拟字段和参数,以及默认模拟行为可以修改以适应特定测试的需要的方式。 本章的其他部分细谈,但基本是: @Mocked是中央嘲讽注解,有一个可选的属性,它是在某些情况下非常有用; @Injectable是另一种嘲弄的注释,从而限制了讥诮的实例方法单个模拟实例; 和@Capturing又是一个标注讥诮,延伸到嘲讽类实现嘲笑接口,或扩展嘲笑类的子类。 当@Injectable或@Capturing被施加到模拟域或模拟参数, @Mocked是隐含的,因此不需要(但是可以)被施加为好。
由JMockit创建的模拟实例可以在测试代码(用于期望的记录和验证)中正常使用,和/或传递到测试中的代码。 或者他们可能只是闲置。 不同于其他嘲笑的API,这些嘲笑对象不必是被测的代码中使用的那些时,它调用其依赖实例方法。默认情况下(例如,当@Injectable不使用),JMockit并不关心其上一个对象实例嘲笑方法被调用。 这使得在测试中直接创建内部代码实例的透明嘲讽,当上述代码调用使用全新的实例构造new
运营商; 实例化的类必须由测试代码中声明的模拟类型覆盖,这就是全部。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,083评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,537评论 25 707
  • 1.Creating mock objects 1.1Class mocks idclassMock=OCMCla...
    奔跑的小小鱼阅读 2,521评论 0 0
  • 2017-11-21日 对小人勤打招呼,少说话;不主动来往,但不拒绝来往;不深...
    敏儿joyceye臻美国际女皇阅读 445评论 0 0
  • 我好久没有半夜醒来了。自从开学以来。 我很害怕黑夜,总有人觉得我很胆大,也总有人会问我,你怕什么。我也总会胡诌一句...
    南风思阅读 158评论 0 0