gpt4 book ai didi

java - Mockito 如何监视模拟内部方法调用?

转载 作者:行者123 更新时间:2023-11-30 03:28:40 24 4
gpt4 key购买 nike

我一直认为 Mockito 可以运行某种代理之类的东西。但现在我发现,Mockito 允许我做类似的事情

class A {
public String m1() {
return m2();
}

public String m2() {
return "Hello";
}
}

class TestA {
public testM1() {
A a = Mockito.spy(A.class);
when(a.m2()).thenReturn("Bye");
Assert.assertEquals(a.m1(), "Bye");
}
}

这不适用于代理。它是如何做到这一点的?该技术可用于允许调用内部 AOP 方法吗? (参见Spring AOP not working for method call inside another method)

最佳答案

Mockito 可以与代理一起使用,并且支持 spy 。不过,你的语法有点不对劲:

/* BAD */  A a = Mockito.spy(A.class);
/* GOOD */ A a = Mockito.spy(new A());

不同行为的原因是 a 没有将参数委托(delegate)给 spy(),而是复制字段值到一个全新生成的 A 子类,并覆盖其所有方法。因此,在 Spring 中,A 中对 this 的引用引用未包装的实例,而在 Mockito 中对 this 的引用引用包装的对象 — 包括对 的隐式引用>thism1 内的 m2() 调用中。

虽然这听起来像是允许使用 AOP,但我无法测试它是否有效,并且相信这将取决于 Mockito 和 Spring AOP 的实现细节(以及包装的顺序)发生)。

[社论:即使您可以让两个代码生成系统很好地协同工作,您和您的同事是否能够在一年后阅读/理解/调试该测试? :)]

关于java - Mockito 如何监视模拟内部方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com