Mockito - 间谍bug - 记录作为调用的时间

时间:2016-10-12 11:04:11

标签: java unit-testing mockito

我有一些非常简单的代码,如下所示。

@Test
public void bugInInvokingASpyAndVerification() throws ColdDayException {
    //given
    Engine en = new Engine();
    Engine spyEngine = spy(en);

    Vehicle realDeal = new Vehicle(new Wheel(), spyEngine, new Brake());
    Vehicle spyVehicle = spy(realDeal);

    //When part - set-up stubs
    when(spyVehicle.start(true)).thenReturn("Sure");
    //Mockito.reset(spyVehicle);

    //then part - actual calls + verifications
    String x = spyVehicle.start(true);

    assertEquals(x, "Sure");
    verify(spyVehicle, times(1)).start(true);
    verify(spyEngine, atLeastOnce()).startEngine(true);
    verify(spyEngine, times(1)).startEngine(true);      
}

以上代码似乎将“何时”通话记录为“开始”&因此第一次'验证'失败了。该代码仅在我取消注释“重置”时才有效。我在Windows上使用Mockito 2.1.0,使用Java 1.8。

1 个答案:

答案 0 :(得分:2)

确实,在when(spyVehicle.start(true)).thenReturn("Sure");行中,您致电start。 有几种方法可以避免这种情况。

其中一个是使用doReturn

 doReturn("Sure").when(spyVehicle).start(eq(true));

注意,这里我们正在进行存根而不是调用方法。