Héctor
Héctor

Reputation: 26034

Mockito and JUnit issue

I have this test:

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

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

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

and the implementation of 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;
    }
}

When I execute the test, it fails:

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

But I don't know why. It seems the mock is not returning what I want.

What am I doing wrong?

Thanks.

Upvotes: 1

Views: 91

Answers (1)

JB Nizet
JB Nizet

Reputation: 691655

You're mocking the class under test. Doing that relaces all the methods by methods doing nothing, and returning default values.

If you want to do that, you'll need a spy, or a partial mock.

With a spy:

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

With a partial mock:

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

Upvotes: 2

Related Questions