This example demonstrates how to use Mockito's spy
functionality to mock a specific method within a class. Let's say we have a class called MyClass
:
public class MyClass { public int add(int a, int b) { return a + b + internalMethod(); } private int internalMethod() { return 5; // This is the method we want to isolate } public int anotherMethod() { return 10; } }
We want to test the add
method, but we don't want the result to be affected by the internalMethod
. We can use a spy to mock just the internalMethod
:
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; public class MyClassTest { @Test void testAddMethod() { MyClass myClassSpy = spy(MyClass.class); when(myClassSpy.internalMethod()).thenReturn(10); // Mock the internal method int result = myClassSpy.add(2, 3); assertEquals(15, result); // 2 + 3 + 10 = 15 } }
In this example, we create a spy of MyClass
. Then, using when(myClassSpy.internalMethod()).thenReturn(10);
, we stub the internalMethod
to return 10, isolating its behavior from the add
method's test. The assertion then verifies that the add
method behaves correctly given the mocked internalMethod
.
spy
functionality to isolate and test a specific method within a class?Mockito's spy
allows you to create a partial mock of an existing object. This means you can retain the real implementation of most methods while selectively mocking specific methods. To use it, you create a spy using Mockito.spy(yourObject)
. Then, you use Mockito's when()
method to specify the behavior of the methods you want to mock. For instance:
MyClass myClass = new MyClass(); MyClass myClassSpy = spy(myClass); when(myClassSpy.internalMethod()).thenReturn(10); // Mock only internalMethod
This will create a spy object myClassSpy
. Calls to internalMethod
on myClassSpy
will return 10. All other methods will use their real implementation. This enables targeted testing of a specific method's behavior in isolation from the rest of the class. Remember that you must use when
to define behavior for the method you want to mock; otherwise, it will call the real implementation.
While spies offer the advantage of testing interactions with real implementations, they introduce several potential pitfalls:
internalMethod
modifies the object's state, that modification will still happen, even though you've mocked its return value.You should generally favor mocking over spying unless you have a compelling reason to use a spy. Choose a spy when:
However, even in these scenarios, carefully consider the potential pitfalls mentioned above. If possible, refactoring your code to make it more testable is usually a better long-term solution than relying on spies to work around complex dependencies or side effects. Often, a well-structured design with clear separation of concerns will allow for simpler and more reliable tests using mocks.
The above is the detailed content of Mockito Spy: Mocking a Method in the Same Class Example. For more information, please follow other related articles on the PHP Chinese website!