Introduction
Test doubles help us replace real parts in tests to check behavior safely and easily.
Test doubles help us replace real parts in tests to check behavior safely and easily.
public interface Service {
String getData();
}
// Stub example
class StubService implements Service {
public String getData() {
return "stub data";
}
}
// Mock example using Mockito
Service mockService = Mockito.mock(Service.class);
Mockito.when(mockService.getData()).thenReturn("mock data");
// Spy example using Mockito
Service realService = new RealService();
Service spyService = Mockito.spy(realService);
Mockito.when(spyService.getData()).thenReturn("spy data");Test doubles include stubs, mocks, spies, and fakes.
Mockito is a popular library to create mocks and spies in JUnit tests.
class StubService implements Service { public String getData() { return "stub data"; } }
Service mockService = Mockito.mock(Service.class); Mockito.when(mockService.getData()).thenReturn("mock data");
Service realService = new RealService();
Service spyService = Mockito.spy(realService);
Mockito.when(spyService.getData()).thenReturn("spy data");This test class shows stub, mock, and spy usage with JUnit and Mockito.
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import org.mockito.Mockito; interface Service { String getData(); } class RealService implements Service { public String getData() { return "real data"; } } public class DoubleTest { @Test void testStub() { Service stub = new Service() { public String getData() { return "stub data"; } }; assertEquals("stub data", stub.getData()); } @Test void testMock() { Service mock = Mockito.mock(Service.class); Mockito.when(mock.getData()).thenReturn("mock data"); assertEquals("mock data", mock.getData()); Mockito.verify(mock).getData(); } @Test void testSpy() { RealService real = new RealService(); Service spy = Mockito.spy(real); Mockito.when(spy.getData()).thenReturn("spy data"); assertEquals("spy data", spy.getData()); Mockito.verify(spy).getData(); } }
Use stubs to provide simple fixed responses.
Use mocks to check if methods were called and control returns.
Use spies to wrap real objects but override some behavior.
Different doubles help test parts safely and clearly.
Stubs return fixed data, mocks verify calls, spies wrap real objects.
Choosing the right double makes tests easier and more reliable.
List<String> list = Mockito.spy(new ArrayList<>());
list.add("one");
Mockito.verify(list).add("one");
System.out.println(list.size());MyService service = Mockito.mock(MyService.class); service.process(); Mockito.verify(service.process());
Pass the test and this pattern moves unknown