A big issue with TDD is people don't know how to write tests. People tend to write covariant tests where if details of the implementation changes, then the tests fail, even if the code is working correctly. These tests are easy to write, but bring very little benefit. There's another kind of test that few people write that solves this problem: they're contravariant. The detail implementation can change and yet contravariant tests can test that the code is still working correctly. In other words, you can refactor code and still use your existing tests to ensure the refactor didn't break anything. You don't re-write your test.
Another benefit of contravariant tests? It's very difficult to create them if your architecture and design is poor. Contravariant tests lead to good architecture and design.
Another benefit of contravariant tests? It's very difficult to create them if your architecture and design is poor. Contravariant tests lead to good architecture and design.
Bob Martin discussed these issues in his blog a few years back. https://blog.cleancoder.com/uncle-bob/2017/10/03/TestContrav...