My last job was quite an eye-opener as far as TDD was concerned. I was a C++ developer in my team who also coded in Java as the need arose. The Java team lead would absolutely INSIST that we write the JUnit tests before coding the actual implementation (no such headache for the C++ side). It was a major pain because the time we should be doing "real work" would be used up for writing tests.
We came to appreciate that however when we got into the maintenance phase of the project. Just running the tests quickly would give us confidence that the nothing we did in the current release had broken whatever was existing. We had a bunch of test-harnesses for each Java module in the system. It was the coolest thing I had seen!