mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口
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模拟了协作的coffeeMachine
和toaster
-因此它们需要Mock
注释-这样我们可以验证是否调用了预期的方法。 女服务员是真的 ,她正在接受测试。 通过在她身上放置@InjectMocks
,Mockito创建一个实例并传入两个协作者-然后调用我们实际的@Test
-annotated方法。
不幸的是,它失败了:一旦运行测试,Mockito就会引发运行时异常: “无法实例化名为'waitress'的@InjectMocks字段! 原因:“ KitchenStaff”类型是接口。”
原因
幸运的是,最近Mockito的错误消息已得到改进,并且清楚地指出了问题所在: KitchenStaff
类型是一种接口。
- 我们有一个界面。
interface KitchenStaff { void serve(MealType mealType); }
- 我们对Mockito说:“实例化此接口”(什么?)
@InjectMocks KitchenStaff waitress
- 嘿,那不对!
您不能仅在接口上使用@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字段:类型是接口相关推荐
- mockito_Mockito:无法实例化@InjectMocks字段:类型是接口
mockito 使用Mockito进行Java类的模拟和存根的任何人,可能都熟悉InjectMocks -annotation. 在要测试的类上使用此批注,Mockito将尝试通过构造函数注入,set ...
- mockito 静态方法_Mockito –带有注释和静态方法的额外接口
mockito 静态方法 在代码中,我最近遇到了一段非常糟糕的代码,该代码基于对对象执行某些操作的类转换. 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这 ...
- mockito模拟依赖注入_Mockito间谍–部分模拟
mockito模拟依赖注入 We can use Mockito Spy to partial mock an object. When we spy on an object, the real m ...
- java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处
C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...
- PHP调用wsdl文件类型的接口代码分享
本文给大家分享了一个PHP调用wsdl文件类型的接口代码,非常的简单也很实用,有相关需求的小伙伴们可以直接拿去用的. 复制代码 代码如下: <?php // 本类由系统自动生成,仅供测试用途 c ...
- java抽象类与接口区别6_java基础知识(6)---抽象类与接口
抽象类: abstract 抽象:不具体,看不明白.抽象类表象体现. 在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstrac ...
- 函数没有“as”子句;假定返回类型为 object。_TypeScript笔记(一)类型amp;接口...
数据类型 TS是强类型的JS,TS会被编译成JS在浏览器环境下运行,在遇到类型错误时,TS会在编译时类型检查并报错,在上传到服务器之前报错,这就意味着用户不会感知到TS的类型错误,而JS在执行时报错, ...
- Go_笔试题记录-指针与值类型实现接口的区别
1.如果Add函数的调用代码为: func main() {var a Integer = 1var b Integer = 2var i interface{} = &asum := i.( ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类 ...
最新文章
- mysql双数据源动态切换_Spring boot+Mybatis多数据源动态切换
- OpenCASCADE:形状愈合之形状自定义
- netty 为什么用nio 不用 aio
- 使用EMR-Kafka Connect进行数据迁移
- 《如何搭建小微企业风控模型》第一节 小微企业数据贷发展情况概述
- 几个简单的Makefile
- react-native 添加 Toast 模块
- CentOS6.5 linux 逻辑卷管理 调整分区大小
- 协同编辑中使用的 OT 算法是什么?
- 乐高机器人骨奥_乐高机器人这个大坑,为啥大家都拽着孩子往里跳?
- 数据库原理及应用习题三
- 计算机控制面板设置命令,电脑的控制面板在哪打开,分享四种打开方法
- 临床医学计算机思维的应用情况,【临床医学论文】临床医学教育中循证医学思维的应用(共6584字)...
- 数组根据某个条件筛选出符合的数据,生成一个新的数组
- 2022年MinGW-w64的安装及配置教程(傻瓜式)
- Luminati LPM在Linux下安装教程
- c++如何批量修改文件后缀名
- 第四章 开始Unity Shader学习之旅(1)
- 修者和修士不同,修士又称修道者
- 三菱PLC远程监控与数据采集方案
热门文章
- 【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty
- 洛谷P3607:Subsequence Reversal P(区间dp)
- 选数游戏(ybtoj-二叉堆)
- P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
- AT3955-[AGC023D]Go Home【结论,递归】
- jzoj4273-圣章-精灵使的魔法语【线段树】
- codeforces1301 F. Super Jaber(多源bfs+枚举)
- 【模板】一维树状数组
- 【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)
- 奶牛的交叉路(jzoj 1756)