Spies watch real functions without replacing them:
const spy = jest.spyOn(console, 'log');
myFunction(); // calls console.log internally
expect(spy).toHaveBeenCalled();
expect(spy).toHaveBeenCalledWith('expected message');
spy.mockRestore(); // Restore original
Spies are useful when you want to verify calls but keep real behavior.