Mockito如何监视mock内部方法调用



我一直认为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不适用于另一个方法内部的方法调用)

Mockito可以使用代理,并且支持间谍。不过,您的语法有点偏离:

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

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

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

[社论:即使你能让这两个代码生成系统很好地协同工作,你和你的同事一年后能阅读/理解/调试测试吗?:)]

相关内容

  • 没有找到相关文章

最新更新