TDD is one of the most controversial subjects in the software industry. Its promises are many: a codebase that continuously checks itself, reduces maintainability costs, simplifies introduction of changes, and allows faster work cycles. Unfortunately, high expectations lead to high disappointments. Many good teams have found themselves enchained in webs of mock objects that not only hindered every promise made by TDD originally, but were more costly to maintain than the codebase itself! No wonder why TDD has been declared as waste by many respected professionals. Heck, I was hit by TDD's dark side myself... but found a way to slay the complexity dragon. In this session I'm going to share what I've learned the hard way: how to make peace with mock objects, how to avoid accidental complexities, and ultimately, how to make TDD work for you.