É um pouco pelo contrário: TDD é uma das formas de vc identificar dependências que podem ser injetadas, e os Mocks e Stubs te ajudam a manter a testabilidade da sua unidade de código, ou seja, desfazendo suas afirmações: Não, mocks e stubs não te garantem desacoplamento, mas quando vc usa TDD, ele te ajuda a identificar dependências e pode fazer uso de mocks e stubs para que seus testes unitários sejam realmente unitários.
leitura recomendada (e velha):
1) Não. Existem outras formas, e tem até uma thread sobre o uso de frameworks de DI que pode te ajudar a entender melhor isso (não só a injeção de dependência em si, mas o uso de frameworks para resolvê-la, e até a discussão de outras formas de Inversion Of Control).
2) Service Locator (embora ninguém goste muito de usá-lo), Factories, e outros, são exemplo de uso de Inversion of Control... mas como respondi anteriormente, isso não é o que garante que seus testes sejam realmente unitários. Você está confundindo Inversion Of Control, com Mocks e Stubs... apesar de Mocks e Stubs serem usados nos testes sendo injetados, eles não são forma de implementar IoC... eles te dão testabilidade.