Mockito Spy不会称之为真实物体

时间:2015-12-12 16:19:59

标签: java junit mockito

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。据我所知,间谍应该调用真正的Object方法。在这种情况下,getSum()应该返回3并且控制台显示

Verify Class constructor called
get sum called
after when :4

相反,它返回thenReturn(4)中分配的4。有任何澄清吗?

1 个答案:

答案 0 :(得分:3)

监视对象意味着实际方法被调用,除非它被存根。引用Mockito Javadoc(强调我的):

  

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

因为在这种情况下你正在对getSum进行存根(通过做Mockito.when(spy.getSum(1,2))),所以真正的方法不会被调用;存根是。

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

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