如果要编写轻量级的JUnit测试, Mockito是我最喜欢的小帮手。 如有必要,可以通过模拟轻松地替换被测单元的“实际”依赖关系,这非常有用。 尤其是在处理框架API的边界线时,此类依赖项的设置否则可能非常昂贵。

但是有时候情况要复杂一些。 例如,如果测试出于某种原因需要与至少一个属于这种框架的真实实例进行交互。 如果此交互包括将模拟作为参数传递给此实例,那么很幸运,实现会将参数强制转换为从交互器的角度来看未知的类型。

这是一个简单的例子来澄清这一点:

public interface Foo {[...]
}public class Bar {public Bar( Foo foo ) {Runnable runnable = ( Runnable )foo;runnable.run();}[...]
}public class SomeTest {@Testpublic void testConstructor() {Foo fooMock = mock( Foo.class );// fails with ClassCastExceptionBar bar = new Bar( fooMock );[...]}
}

可以将Bar类视为需要某种实现的框架代码。 由于参数类型Foo不能反映这种期望,因此将Foo模拟传递给Bar的构造函数将导致测试失败,并带有ClassCastException

也许您在想到上述情况时首先想到的是,框架通过强制转换为未声明的类型而变得很糟,并且最好将所有内容扔掉并重新开始,从而更好!

不幸的是,在现实世界中,这种行为可以说是有效的。 例如, Eclipse平台具有许多被声明为“不打算由客户端实现”的接口。 一个很好的例子就是团队API的IHistoryView接口。 可以肯定地使用3.x平台,尽管IHistoryView实现扩展了IViewPart ,但是历史视图界面并未公开这一细节。

在这种情况下,有时可能需要创建多种类型的模拟-一种实现IHistoryViewIViewPart的模拟-尽管API并未指出所有这些。 Mockito通过鲜为人知的MockSettings#extraInterfaces模拟配置功能简化了此过程。 以下代码段显示了如何使用extraInterfaces修复上述示例的测试。

@Test
public void testConstructor() {Foo mock = mock( Foo.class,withSettings().extraInterfaces( Runnable.class ) );// the mock now supports the cast to runnableBar bar = new Bar( mock );[...]
}

使用withSettings的方法调用会创建一个新的MockSettings实例,并使用其他Runnable类型MockSettings进行配置。 生成的Foo模拟实例同时实现FooRunnable 。 现在测试通过了。

但是请记住,尽管在这篇文章中使用额外接口的动机似乎是合理的,但要强调的是,在实际使用此功能之前,您应该三思而后行。 或者如文档所述,“如果您碰巧经常使用它,请确保您确实在编写简单,干净且可读的代码。” 粗心地使用它绝对是一个预定的突破点。

翻译自: https://www.javacodegeeks.com/2014/03/what-are-mockito-extra-interfaces.html

什么是Mockito Extra接口?相关推荐

  1. mockito接口_什么是Mockito Extra接口?

    mockito接口 如果要编写轻量级的JUnit测试, Mockito是我最喜欢的小帮手. 如有必要,可以通过模拟轻松地替换被测单元的"实际"依赖关系,这非常有用. 特别是在处理框 ...

  2. 单元测试mock之mockito使用

    先来一个简单的例子来感受一下 外部接口类:TestService.java 1 package com.yzl.mock; 2 3 /** 4 * 测试用服务 5 * 6 * @author yang ...

  3. RTL8367RB -CG

    第2层管理的5 + 2-端口10/100/1000开关控制器 RTL8367RB是一款LQFP128 EPAD,高性能5 + 2端口千兆以太网交换机. RTL8367RB具有支持1000Base-T, ...

  4. Android开发模式:模型—视图—主导器模式

    我们有可能使用过MVC(Model-View-Controller)模式,但当我们用更优的方法测试Android代码时,使用MVP(模型-视图-主导器:Model-View-Presenter)模式可 ...

  5. OPhone程序开发入门之音乐播放器

    OPhone程序开发入门之音乐播放器 OPhone平台提供了完整的多媒体解决方案.为开发者提供了统一的,简单易用的开发接口.本文首先介绍了OPhone平台的多媒体框架,然后详细介绍了 在OPhone平 ...

  6. 转 Java知识——精华总结

    一.java概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.  为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路. ...

  7. 编程资料 -C# 多线程

    编程资料 - 多线程 C#多线程编程实例实战 作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996 单个写入程序/多个阅读程序在.Net ...

  8. 编程资料 -C# 多线程 1

    编程资料 - 多线程 C#多线程编程实例实战 作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996 单个写入程序/多个阅读程序在.Net ...

  9. mockito 静态方法_Mockito –带有注释和静态方法的额外接口

    mockito 静态方法 在代码中,我最近遇到了一段非常糟糕的代码,该代码基于对对象执行某些操作的类转换. 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这 ...

最新文章

  1. CentOS Squid
  2. ASP.NET Core 项目简单实现身份验证及鉴权
  3. Google 超分辨率技术 RAISR
  4. 报错,could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarExc
  5. java write阻塞_java socket/output stream writes:他们阻塞?
  6. Nmap 可能引起cisco路由器Crash
  7. 【golang-GUI开发】struct tags系统(一)
  8. shell 函数和数组
  9. Vite+Vue3创建项目案例
  10. jtopo 折叠与展开子节点
  11. VirtualBox中不能正常使用OpneGL的问题
  12. Adaptive Supply Chain: Demand–Supply Synchronization Using Deep Reinforcement Learning翻译
  13. 使用输出语句输出一个正方形
  14. 计算机论文中的技术路线,论文中的技术路线图怎么写
  15. html-----简易版音乐播放器
  16. 服务器系统可以备份,服务器操作系统可以备份吗
  17. opencv_dnn模型部署学习记录
  18. 中国做SaaS为什么这么难?
  19. mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
  20. 新手从零入手 JQuery 【看这篇】

热门文章

  1. ddm模型公式_简单判断目前行情——从股利贴现模型切入
  2. web项目的创建和发布
  3. fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...
  4. java序列化深克隆_如何在内存序列化中使用Java深克隆对象
  5. 2018-12 jdk_JDK 12新闻(2018年9月13日)
  6. 2018年4月13日_Java的最新发展– 2018年4月下旬
  7. jvm jstat_使用jstat的JVM统计信息
  8. 部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...
  9. 使用Spring AOP和番石榴速率限制器的节气门方法
  10. 春春幼儿园堆积木大赛_春云边车