Java Mockito Spy不会调用真实对象

Java Mockito Spy不会调用真实对象,java,junit,mockito,Java,Junit,Mockito,上述类的getSum()方法通过spy()进行测试。下面是如何使用间谍 public class VerifyClass { public VerifyClass() { System.out.println("Verify Class constructor called"); } public int getSum(int a,int b){ System.out.println("get sum called");

上述类的
getSum()
方法通过
spy()
进行测试。下面是如何使用间谍

public class VerifyClass {

    public VerifyClass() {
        System.out.println("Verify Class constructor called");
    }

    public int getSum(int a,int b){
        System.out.println("get sum called");
        return a+b;
    }

}
assertEquals
被传递。据我所知,间谍应该调用真实对象的方法。在这种情况下,
getSum()
应该返回3并显示控制台

@Test
public void testSpy(){
    VerifyClass ob=new VerifyClass();
    VerifyClass spy=Mockito.spy( ob );
    Mockito.when(spy.getSum(1,2)).thenReturn(4);
    System.out.println("after when :" + spy.getSum(1,2));
    assertEquals(4, spy.getSum(1,2));
}

相反,它返回在
中分配的4,然后返回(4)
。请澄清一下?

监视对象意味着真正的方法正在被调用,除非它被存根。引用(重点):

您可以创建真实对象的间谍。当您使用spy时,将调用真正的方法(,除非方法被存根)

由于在本例中,您正在存根
getSum
(通过执行
Mockito.when(spy.getSum(1,2))
),因此不会调用真正的方法;存根是

作为旁注,实际的
getSum
实际上是在编写
Mockito时被调用的。当(spy.getSum(1,2))
时,这就是日志显示
getSum called
的原因。如果你不想发生这种情况,你可以使用

Verify Class constructor called
get sum called
after when :4
doReturn(4).when(spy).getSum(1, 2);