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

更新时间:2023-06-28 14:54:08 阅读: 评论:0

mockito接⼝没法赋值_Mockito:⽆法实例化@InjectMocks字
段:类型是接⼝
mockito接⼝没法赋值
使⽤Mockito进⾏Java类的模拟和存根的任何⼈,可能都熟悉InjectMocks -annotation。 在要测试的类上使⽤此批注,Mockito将尝试通过构造函数注⼊,tter注⼊或属性注⼊来注⼊模拟。 魔术成功了,它⽆声地失败了,或者抛出了MockitoException 。
我想解释什么原因导致“ MockitoException:⽆法实例化名为xxx的@InjectMocks字段! 原因:类型是接⼝”以及解决⽅法。
问题
考虑以下JUnit 5测试,该测试可以验证⼥服务员是否可以正确提供早餐。 厨房⼯作⼈员中的任何⼈都可以提供早餐,并且该测试会验证当提供早餐时,咖啡机开始冲泡咖啡,⽽烤⾯包机开始烘烤。
@ExtendWith (MockitoExtension. class )  public class WaitressTest {
@Mock
CoffeeMachine coffeeMachine;
@Mock
Toaster toaster;
@InjectMocks
KitchenStaff waitress;
@Test
void should_rve_breakfast() {
waitress.rve(BREAKFAST);
verify(coffeeMachine).brew();
verify(toaster).toast();
}  }  interface KitchenStaff {
void rve(MealType mealType);  }  Waitress class implements KitchenStaff {
CoffeeMachine coffeeMachine;
马桶堵Toaster toaster;
//...
@Override
妈妈的英语怎么读
public void rve(MealType mealType) {
coffeeMachine.brew();
}  }
出于此测试的⽬的,Mockito模拟了协作的coffeeMachine和toaster -因此它们需要Mock注释-这样我们可以验证是否调⽤了预期的⽅法。 ⼥服务员是真的 ,她正在接受测试。 通过在她⾝上放置@InjectMocks ,Mockito创建⼀个实例并传⼊两个协作者-然后调⽤我们实际
的@Test -annotated⽅法。
不幸的是,它失败了:⼀旦运⾏测试,Mockito就会引发运⾏时异常: “⽆法实例化名为'waitress'的@InjectMocks字段! 原因:“KitchenStaff”类型是接⼝。”
原因
幸运的是,最近Mockito的错误消息已得到改进,并且清楚地指出了问题所在: KitchenStaff类型是⼀种接⼝。
1. 我们有⼀个界⾯。
interface KitchenStaff {
void rve(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 tup() {
辉煌反义词waitress = new Waitress(coffeeMachine, toaster);  }
关于禁毒的征文
结论
相信⼥服务员为您做些敬酒。
翻译⾃:
mockito接⼝没法赋值

本文发布于:2023-06-28 14:54:08,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1059616.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:提供   测试   早餐
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图