Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito如何监视模拟内部方法调用?_Java_Mockito - Fatal编程技术网

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

Java Mockito如何监视模拟内部方法调用?,java,mockito,Java,Mockito,我一直认为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");

我一直认为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方法吗?(请参阅)

莫基托确实与代理人合作,并且支持间谍。不过,您的语法有点不正确:

/* BAD */  A a = Mockito.spy(A.class);
/* GOOD */ A a = Mockito.spy(new A());
不同行为的原因是
a
不会将参数委托给
spy()
,而是将字段值复制到a的全新生成的子类,并覆盖其所有方法。因此,在Spring中,A中对
this
的引用是指未包装的实例,而在Mockito中对
this
的引用是指包装的对象,包括
m2()
中对
this
的隐式引用

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

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