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;
    }

}


上类的getSum()方法通过spy()测试。以下是间谍的使用方式。

@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));
}


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

Verify Class constructor called
get sum called
after when :4


而是返回在thenReturn(4)中分配的4。请澄清一下吗?

最佳答案

监视对象意味着将调用真实方法,除非已对其进行了存根。引用Mockito Javadoc(重点为我):


  您可以创建真实对象的间谍。当您使用间谍时,将调用实际方法(除非对方法进行了加注)。


由于在这种情况下,您要对getSum进行存根(通过执行Mockito.when(spy.getSum(1,2))),因此不会调用real方法;存根是。

附带说明,真正的getSum实际上是在编写Mockito.when(spy.getSum(1,2))时被调用的,这就是为什么日志中显示get sum called的原因。如果您不希望发生这种情况,可以使用

doReturn(4).when(spy).getSum(1, 2);

10-07 13:36