Aaron
Aaron

Reputation: 1332

How to replace method invocation with mock?

I have a class with two methods. I want to replace invocation of second method with expected result.

Here is my class under test

public class A {
    public int methodOne() {
        return methodTwo(1);
    }

    public int methodTwo(int param) {
        // corresponding logic replaced for demo
        throw new RuntimeException("Wrong invocation!");
    }
}

And test

public class ATest {
    @Test
    public void test() {
        final A a = spy(new A());
        when(a.methodTwo(anyInt())).thenReturn(10);
        a.methodOne();
        verify(a, times(1)).methodTwo(anyInt());
    }
}

Why I'm get an exception when start the test?

Upvotes: 0

Views: 612

Answers (1)

John Ericksen
John Ericksen

Reputation: 11113

Two things that will help you here. First, from the documentation it seems you need to use the do*() api with spy() objects. Second, to call the "real" method you need to declare it specifically using doCallRealMethod()

Here's the updated test that should work for you:

public class ATest {
    @Test
    public void test() {
        final A a = spy(new A());
        doReturn(10).when(a).methodTwo(anyInt());
        doCallRealMethod().when(a).methodOne();
        a.methodOne();
        verify(a, times(1)).methodTwo(anyInt());
    }
}

Upvotes: 2

Related Questions