Search code examples
objectmockinglocalmockito

Mocking methods of local scope objects with Mockito


I need some help with this:

Example:

void method1{
    MyObject obj1=new MyObject();
    obj1.method1();
}

I want to mock obj1.method1() in my test but to be transparent so I don't want make and change of code. Is there any way to do this in Mockito?


Solution

  • The answer from @edutesoy points to the documentation of PowerMockito and mentions constructor mocking as a hint but doesn't mention how to apply that to the current problem in the question.

    Here is a solution based on that. Taking the code from the question:

    public class MyClass {
        void method1 {
            MyObject obj1 = new MyObject();
            obj1.method1();
        }
    }
    

    The following test will create a mock of the MyObject instance class via preparing the class that instantiates it (in this example I am calling it MyClass) with PowerMock and letting PowerMockito to stub the constructor of MyObject class, then letting you stub the MyObject instance method1() call:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(MyClass.class)
    public class MyClassTest {
        @Test
        public void testMethod1() {      
            MyObject myObjectMock = mock(MyObject.class);
            when(myObjectMock.method1()).thenReturn(<whatever you want to return>);   
            PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock);
            
            MyClass objectTested = new MyClass();
            objectTested.method1();
            
            ... // your assertions or verification here 
        }
    }
    

    With that your internal method1() call will return what you want.

    If you like the one-liners you can make the code shorter by creating the mock and the stub inline:

    MyObject myObjectMock = when(mock(MyObject.class).method1()).thenReturn(<whatever you want>).getMock();