Mockito 和 JUnit 问题

Mockito and JUnit issue

我有这个测试:

@Test
public void shouldReturn2Hours() {
    Float expectedHours = 2f;

    WorkChronometer workChronometer = Mockito.mock(WorkChronometer.class);
    Mockito.when(workChronometer.getAccumulatedMinutes()).thenReturn(120);

    Assert.assertEquals(expectedHours, workChronometer.getAccumulatedHours());
}

WorkChronometer的执行:

public class WorkChronometer {

    private DateTime startingInstant;
    private DateTime stoppingInstant;
    private Boolean  counting;

    //More methods

    public Integer getAccumulatedMinutes() {
        if (counting)
            throw new RuntimeException("Call stopCount first!");

        if (startingInstant == null || stoppingInstant == null)
            return 0;

        return Minutes.minutesBetween(startingInstant, stoppingInstant).getMinutes();
    }

    public Float getAccumulatedHours() {
        Integer accumulatedMinutes = getAccumulatedMinutes();
        return accumulatedMinutes / 60f;
    }
}

当我执行测试时,它失败了:

junit.framework.AssertionFailedError: expected:<2.0> but was:<0.0>

但我不知道为什么。模拟似乎没有返回我想要的。

我做错了什么?

谢谢。

你在嘲笑正在测试的 class。这样做会通过不执行任何操作并返回默认值的方法来替换 所有 方法。

如果你想这样做,你需要一个间谍,或者一个部分模拟。

有间谍:

@Test
public void shouldReturn2Hours() {
    Float expectedHours = 2f;

    WorkChronometer workChronometer = new WorkChronometer();
    WorkChronometer spy = Mockito.spy(workChronometer);
    doReturn(120).when(spy).getAccumulatedMinutes();

    Assert.assertEquals(expectedHours, spy.getAccumulatedHours());
}

部分模拟:

@Test
public void shouldReturn2Hours() {
    Float expectedHours = 2f;

    WorkChronometer workChronometer = Mockito.mock(WorkChronometer.class);
    Mockito.when(workChronometer.getAccumulatedHours()).thenCallRealMethod();

    Mockito.when(workChronometer.getAccumulatedMinutes()).thenReturn(120);
    Assert.assertEquals(expectedHours, workChronometer.getAccumulatedHours());
}