mockito

使用Mockito进行Java类的模拟和存根的任何人,可能都熟悉InjectMocks -annotation。 在要测试上使用此批注,Mockito将尝试通过构造函数注入,setter注入或属性注入来注入模拟。 该魔术成功,无提示失败或抛出MockitoException

我想解释什么原因导致“ MockitoException:无法实例化名为xxx的@InjectMocks字段! 原因:类型是接口”以及解决方法。

问题

考虑以下JUnit 5测试,该测试可以验证女服务员是否可以正确提供早餐。 厨房工作人员中的任何人都可以提供早餐,并且该测试会验证当提供早餐时,咖啡机开始冲泡咖啡,而烤面包机开始烘烤。

 @ExtendWith (MockitoExtension. class )public class WaitressTest { @MockCoffeeMachine coffeeMachine;@MockToaster toaster;@InjectMocksKitchenStaff waitress;@Testvoid should_serve_breakfast() { waitress.serve(BREAKFAST);verify(coffeeMachine).brew();verify(toaster).toast();}}interface KitchenStaff {void serve(MealType mealType);}Waitress class implements KitchenStaff { CoffeeMachine coffeeMachine;Toaster toaster;//...@Overridepublic void serve(MealType mealType) {coffeeMachine.brew();toaster.toast();}}

为了测试的目的,Mockito模拟了协作的coffeeMachinetoaster -因此它们需要Mock注释-这样我们就可以验证是否调用了预期的方法。 女服务员是真的,她正在接受测试。 通过在她身上放置@InjectMocks ,Mockito创建一个实例并传入两个协作者-然后调用我们实际的@Test -annotated方法。

不幸的是,它失败了:一旦运行测试,Mockito就会引发运行时异常: “无法实例化名为'waitress'的@InjectMocks字段! 原因:“ KitchenStaff”类型是接口。”

原因

幸运的是,最近Mockito的错误消息已得到改进,并且清楚地指出了问题所在: KitchenStaff类型是一种接口。

  1. 我们有一个界面。

     interface KitchenStaff {void serve(MealType mealType);}
    
  2. 我们对Mockito说:“实例化此接口”(什么?)
     @InjectMocksKitchenStaff waitress
    
  3. 嘿,那不对!

您不能仅在接口上使用@InjectMocks ,因为Mockito需要知道要实例化的具体类

请记住,您正在测试的单元是通常是真实的少数幸运之一。 KitchenStaff只是一个行为合同, Waitress实际上是得到报酬以提供早餐。

与使用抽象类一样,也有一些,但是归结为:在实例声明时提供具体的类型。

为Mockito提供实现该接口的类。

A)声明一个具体的类型

@InjectMocks字段的类型使用具体的实现。

 @InjectMocksWaitress waitress;

B)分配具体类型

继续对@InjectMocks字段使用接口的类型,但是使用具体的实现对其进行初始化。

 @InjectMocksKitchenStaff waitress = new Waitress()

或者当然在声明和初始化中使用具体类型,当然也可以

然而…

但是,您的受测类是否期望(必需)协作者作为构造函数的参数?(我当然希望如此!)

例如,考虑以下单个构造函数:

 Waitress class implements KitchenStaff { final CoffeeMachine coffeeMachine;final Toaster toaster; Waitress(CoffeeMachine coffeeMachine, Toaster toaster) {this .coffeeMachine = coffeeMachine;this .toaster = toaster;}

然后,在没有一个无参数的构造函数,编译器会告诉你调用适当的构造函数,并提供论据就在那里,现在

 @InjectMocksKitchenStaff waitress = new Waitress()^^compiler error

A.通过自己提供参数来解决。

 // compiles again@InjectMocksKitchenStaff waitress = new Waitress(coffeeMachine, toaster);

B.删除@InjectMocks 。 您不再需要它。

 KitchenStaff waitress;@BeforeEachvoid setup() {waitress = new Waitress(coffeeMachine, toaster);}

结论

相信女服务员为您做些美味的面包。

翻译自: https://www.javacodegeeks.com/2020/07/mockito-cannot-instantiate-injectmocks-field-the-type-is-an-interface.html

mockito

mockito_Mockito:无法实例化@InjectMocks字段:类型是接口相关推荐

  1. mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口

    mockito接口没法赋值 使用Mockito进行Java类的模拟和存根的任何人,可能都熟悉InjectMocks -annotation. 在要测试的类上使用此批注,Mockito将尝试通过构造函数 ...

  2. PHP调用wsdl文件类型的接口代码分享

    本文给大家分享了一个PHP调用wsdl文件类型的接口代码,非常的简单也很实用,有相关需求的小伙伴们可以直接拿去用的. 复制代码 代码如下: <?php // 本类由系统自动生成,仅供测试用途 c ...

  3. ORACLE的所有字段类型

    http://space.itpub.net/7648593/viewspace-545486 字段类型            中文说明                                 ...

  4. ACCESS 文本文件导入和导出指定字段类型的方法

    导入文本文件时如何指定字段类型? 2008-01-05 00:34 问题: 我有一个文本文件需要导入 Access ,但是文本文件中有一列数据原本是文本,但是导入数据库后自动变成了"双精度& ...

  5. java反射字段6,java反射判断字段类型

    java动态获取字段类型,深入理解 Java 虚拟机 Java内存区域与内存溢出异常,java反射判断字段类型,java动态添加字段原理 利用java反射获取泛型类的类型参数具体类对象_计算机软件及应 ...

  6. 数据库中html数据类型,常用数据库的字段类型及大小

    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小 ORACLE的数据类型 常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 ...

  7. 数据库mysql表常见字段大小_常用的数据库的字段类型及大小

    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小 ORACLE的数据类型 常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 ...

  8. oracle表的常见字段类型有哪些,Oracle数据库的字段类型

    字 段 类 型 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度 ...

  9. hivesql修改字段类型_Hive SQL常用命令总结,大数据开发人员按需收藏

    Hive是基于Hadoop生态的一个重要组件,是对数据仓库进行管理和分析数据的工具.她提供了SQL查询方式来分析存储在HDFS分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完 ...

最新文章

  1. 3ds max 把模型放置到坐标系中心(原点)
  2. 项目经理应该知道的97件事 --译者序
  3. 约瑟夫问题(c++)
  4. 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
  5. VTK:Rendering之SpecularSpheres
  6. python网络通信编程实例_python网络编程之数据传输UDP实例分析
  7. 【操作系统】常见进程调度算法特点总结比较
  8. 遗留问题,排雷会炸,不排也会炸!
  9. 基于JAVA+SSH+MYSQL的工资管理系统
  10. 杭电计算机研究院排名,2020浙江省大学最新10强排名,浙大第1,杭电第5
  11. Scrapy 轻松定制网络爬虫
  12. 链上结构化产品Ribbon将推出基于看跌期权的资管产品Puts Theta Vault
  13. three 天空球_three.js添加场景背景和天空盒(skybox)代码示例
  14. access ea 可以联网吗_如何看待EA在STEAM上推出EA Play(原EA Access会员)?
  15. Ubuntu安装Hbase数据库
  16. 计算机课怎样制作ppt 课件,如何制作PPT课件视频
  17. Windows XP虚拟机到期无法使用的解决方案(救急版)
  18. 阿里巴巴中台战略--事务与柔性事务
  19. 论文写作中插入公式间距变大怎么办?
  20. 百度BAE上能装什么pHp框架,百度Bae云平台安装dedecms图文教程

热门文章

  1. JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
  2. SEO优化:网站优化的五大步骤
  3. spring与springBoot不同之处
  4. JPQL中使用LIKE进行模糊查询
  5. 详解JavaScript数组(一)
  6. 09、HTLM中直接写get请求和模板标签分片功能
  7. MyEclipse结合Git
  8. 升级PHP到5.3.3的过程及注意事项
  9. golang map 初始化 和 使用
  10. python 单一进程实例 实现