栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Mockito:监视功能接口内部的函数调用?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mockito:监视功能接口内部的函数调用?

这是预期的。Mockito通过创建 浅表副本 来创建间谍,并且

this::add2
在保留对旧引用的同时复制方法引用
this

TestService myTestService = new TestService();TestService mySpy = Mockito.spy(myTestService);

在此示例中,

mySpy
TestService生成的子类的实例
,该类具有重写的所有可重写方法以委托给Mockito,并且其所有实例状态都从浅层复制
myTestService
。这意味着
myTestService.mapping== mySpy.mapping
,这也意味着复制了对
this
(意义
myTestService
)的引用。

应用于实例的方法引用捕获该实例,如“方法引用的种类”下“方法引用”
的Oracle页面上所示。接收

add2
呼叫的对象是原始对象,而不是间谍,因此您得到的是原始行为(4),而不是受到间谍影响的行为(6)。

这应该有点直观:您可以在

Function<Integer,Integer>
不传递TestService实例的情况下调用,因此,该Function包含对TestService实现的隐式引用是很合理的。您看到这种现象的原因是,在初始化并存储功能
,间谍实例的状态会从真实实例中复制
this


考虑可以在TestService上定义的替代方法:

BiFunction<TestService, Integer, Integer> mapping2 = TestService::add2;

在这里,该函数

mapping2
不适用于特定对象,而是适用于传入的TestService的任何实例。因此,您的测试将调用此方法:

@Testpublic void mockitoTest2(){    doReturn(6).when(testService).add2(2);    System.out.println(testService.mapping2.apply(testService, 2));}

…并且因为您传入了间谍

testService
,它将处理对的虚拟方法调用
add2
并调用间谍上设置的行为(返回6)。没有隐式保存
this
的功能,因此您的功能可以按预期工作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647730.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号