What are test doubles and when would you use each type (mock, stub, spy, fake)?

Technical