Programming to an interface instead of programming to an implementation:

While you are writing the test you are thinking about the interface of the object you are testing:

What does this object look like from the outside.

When you go to make the test really work, you are thinking about pure implementation.