Start here. This is the direct spoken answer to practice first.
Why this question matters
The terminology matters less than using each tool for a clear reason. Poor double choices can make a fast suite confidently test behavior that production never has.
A stub supplies controlled answers, a mock verifies an expected interaction, and a fake is a lightweight working implementation such as an in-memory repository with real state behavior. I use them to isolate a unit from slow or nondeterministic boundaries. I prefer a real dependency when its semantics are the thing I need confidence in, especially database translation, transactions, serialization, or framework configuration.