A mock offers us a useful way to set expecations on messages that should be sent, without actually sending those messages. It sounds confusing, so let's talk about it for a bit.
A mock allows us to enforce that certain messages are sent to various collaborators. A stub is a bit different. Think of a stub as a stand-in that returns any kind of hard-coded data. "When this method is called, return
false." Let's dig into this idea a bit more.
Don't worry: a dummy is really easy to understand. If a stub offers us a way to return pre-defined values for method calls, then a dummy strips that all away. They're the perfect stand-ins for collaborators that we don't care about.
So you're starting to get the hang of what a unit test is, right? Well, let's move up the chain a bit, and focus on integration tests. These provide an excellent way to group components in our system, and verify that they work as expected.
Finally have a basic understanding of TDD? Red, green, refactor? Well, then, how does BDD (Behavior-Driven Development) play into all of this? Well, think of BDD as TDD done right. As you'll find, we're less interested in things like object state, and more concerned with the conversation that takes place.
Don't worry: acceptance tests are fairly easy to understand. They are tests, from the point of the view of the customer. Does the feature, as a whole (meaning, from the outside-in), work as they expected?