Mocking methods of local scope objects with Mockito

local, mocking, mockito, object

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

Problem

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?

Original source