Mockito似乎无法监视Functional接口内部的函数调用。假设我有一个带有服务的简单Spring Boot应用程序:
@Service
public class TestService {
Function<Integer, Integer> mapping = this::add2;
Integer add2(Integer integer) {
return integer + 2;
}
}
并进行测试:
@SpyBean
TestService testService;
@Test
public void mockitoTest2(){
doReturn(6).when(testService).add2(2);
System.out.println(testService.mapping.apply(2));
}
测试将返回4而不是6。这是预期的还是值得进行错误报告?
这是预期的。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的任何实例。因此,您的测试将调用此方法:
@Test
public void mockitoTest2(){
doReturn(6).when(testService).add2(2);
System.out.println(testService.mapping2.apply(testService, 2));
}
…并且因为您传入了间谍testService
,它将处理对的虚拟方法调用add2
并调用间谍上设置的行为(返回6)。没有隐式保存this
的功能,因此您的功能可以按预期工作。
我一直认为Mockito工作某种代理之类的东西。但现在我发现,Mockito允许我做一些像 这不适用于代理。它是如何做到这一点的?这种技术可以用来调用内部AOP方法吗?(请参见Spring AOP不适用于另一个方法中的方法调用)
问题内容: 以下是我的控制器中的内容: 而且我想监视,以便在被调用时是: 如何才能做到这一点? 问题答案: 默认情况下,当您与 jasmine一起 使用时,它将模拟该函数,并且实际上不执行其中的任何操作。如果要在其中测试其他函数调用,则需要调用,如下所示: 应该这样做。
本文向大家介绍jasmine 监视现有功能,包括了jasmine 监视现有功能的使用技巧和注意事项,需要的朋友参考一下 示例 茉莉花可以使用该spyOn功能监视现有功能。 侦查函数后,将其替换为间谍,可以查询该间谍以获取有关如何以及何时调用该函数的信息。
我是kotlin的新手,我总是编写java。我尝试了kotlin以java方式编写的一些函数代码,但不起作用。 我将这些代码翻译成java,它就可以工作了。 即使FInter是java接口。它也不起作用。 使现代化 我尝试了一些不同的方法,现在它们都是工作。
我试图在定义它的接口中调用一个事件(请参见下面的代码)。但是,我得到了以下错误:的左侧 我怀疑这可能与接口中声明的所有事件都始终是属性有关。这是一个bug、一个特性吗?有什么解决方法吗? 谢谢。
介绍 本教程会使用snappy压缩/解压缩库来作为一个 Rust 编写外部语言代码绑定的介绍。目前 Rust 还不能直接调用 C++ 库,不过 snappy 库包含一个 C 接口(记录在snappy-c.h中)。 一个关于 libc 的说明 很多这些例子使用libc crate,它提供了很多 C 类型的类型定义,还有很多其他东西。如果你正在自己尝试这些例子,你会需要在你的Cargo.toml中添加
问题内容: 我有一些代码,其结构类似于此 问题是它向我吐了一个错误。 解析错误:语法错误,意外的T_LNUMBER,预期的T_VARIABLE或’$’ 有关于如何在bbcode函数的preg_replace内调用embed_video的想法吗? 谢谢! 问题答案: 您可以在上使用“ e”修饰符(请参见模式修饰符) 告诉将第二个参数视为PHP代码。
问题内容: 我是React的新手,现在我想在表中显示一些记录,现在出现此错误。请帮帮我。 无效的挂接调用。挂钩只能在功能组件的主体内部调用。发生这种情况可能是由于以下原因之一:1.您的React和渲染器版本可能不匹配(例如React DOM)2.您可能违反了《胡克规则》 3.您可能在其中包含多个React版本相同的应用程序请参阅有关如何调试和解决此问题的提示。 问题答案: 因为你。在此处查看更多信