mockito接口没法赋值

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

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

问题

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

 @ExtendWith (MockitoExtension. class )  public class WaitressTest { @Mock CoffeeMachine coffeeMachine; @Mock Toaster toaster; @InjectMocks KitchenStaff waitress; @Test void 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; //... @Override public 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说:“实例化此接口”(什么?)
     @InjectMocks  KitchenStaff waitress 
  3. 嘿,那不对!

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

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

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

给Mockito提供实现接口的类。

A)声明具体类型

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

 @InjectMocks  Waitress waitress; 

B)分配具体类型

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

 @InjectMocks  KitchenStaff waitress = new Waitress() 

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

然而…

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

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

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

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

 @InjectMocks  KitchenStaff waitress = new Waitress() ^^ compiler error 

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

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

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

 KitchenStaff waitress;  @BeforeEach  void 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将尝试通过构造函数注入,set ...

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

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

  3. mockito模拟依赖注入_Mockito间谍–部分模拟

    mockito模拟依赖注入 We can use Mockito Spy to partial mock an object. When we spy on an object, the real m ...

  4. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...

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

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

  6. java抽象类与接口区别6_java基础知识(6)---抽象类与接口

    抽象类: abstract 抽象:不具体,看不明白.抽象类表象体现. 在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstrac ...

  7. 函数没有“as”子句;假定返回类型为 object。_TypeScript笔记(一)类型amp;接口...

    数据类型 TS是强类型的JS,TS会被编译成JS在浏览器环境下运行,在遇到类型错误时,TS会在编译时类型检查并报错,在上传到服务器之前报错,这就意味着用户不会感知到TS的类型错误,而JS在执行时报错, ...

  8. Go_笔试题记录-指针与值类型实现接口的区别

    1.如果Add函数的调用代码为: func main() {var a Integer = 1var b Integer = 2var i interface{} = &asum := i.( ...

  9. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类 ...

最新文章

  1. mysql双数据源动态切换_Spring boot+Mybatis多数据源动态切换
  2. OpenCASCADE:形状愈合之形状自定义
  3. netty 为什么用nio 不用 aio
  4. 使用EMR-Kafka Connect进行数据迁移
  5. 《如何搭建小微企业风控模型》第一节 小微企业数据贷发展情况概述
  6. 几个简单的Makefile
  7. react-native 添加 Toast 模块
  8. CentOS6.5 linux 逻辑卷管理 调整分区大小
  9. 协同编辑中使用的 OT 算法是什么?
  10. 乐高机器人骨奥_乐高机器人这个大坑,为啥大家都拽着孩子往里跳?
  11. 数据库原理及应用习题三
  12. 计算机控制面板设置命令,电脑的控制面板在哪打开,分享四种打开方法
  13. 临床医学计算机思维的应用情况,【临床医学论文】临床医学教育中循证医学思维的应用(共6584字)...
  14. 数组根据某个条件筛选出符合的数据,生成一个新的数组
  15. 2022年MinGW-w64的安装及配置教程(傻瓜式)
  16. Luminati LPM在Linux下安装教程
  17. c++如何批量修改文件后缀名
  18. 第四章 开始Unity Shader学习之旅(1)
  19. 修者和修士不同,修士又称修道者
  20. 三菱PLC远程监控与数据采集方案

热门文章

  1. 【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty
  2. 洛谷P3607:Subsequence Reversal P(区间dp)
  3. 选数游戏(ybtoj-二叉堆)
  4. P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
  5. AT3955-[AGC023D]Go Home【结论,递归】
  6. jzoj4273-圣章-精灵使的魔法语【线段树】
  7. codeforces1301 F. Super Jaber(多源bfs+枚举)
  8. 【模板】一维树状数组
  9. 【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)
  10. 奶牛的交叉路(jzoj 1756)