Originalmente, o TDD veio do movimento ágil, onde os testes foram escritos com antecedência, como uma maneira de garantir que o que você codificou permanecesse correto, dada a especificação que agora estava bem definida no código de teste. Também apareceu como um aspecto muito importante da refatoração, pois quando você modificava seu código, podia confiar nos testes para provar que não havia alterado o comportamento do código.
Em seguida, as pessoas das ferramentas apareceram e pensaram que sabiam informações sobre seu código e, em seguida, poderiam gerar stubs de teste para ajudá-lo a escrever seus testes de unidade, e acho que foi aí que tudo deu errado.
Os stubs de teste são gerados por um computador que não tem idéia do que você está fazendo, apenas produz um stub para todos os métodos, sem pensar, porque é isso que ele deve fazer. Isso significa que você tem um caso de teste para cada método, independentemente da complexidade desse método ou se é adequado para teste isolado.
Isso está chegando ao teste do lado errado da metodologia TDD. No TDD, você deve descobrir o que o código deve fazer e produzir um código que atinja isso. Isso é gratificante, pois você acaba escrevendo testes que provam que o código faz o que o código faz, e não o que deveria fazer. Combinado com a geração automática de stubs de teste baseados em métodos, você desperdiça seu tempo provando cada pequeno aspecto do seu código que pode facilmente provar estar errado quando todos os pequenos pedaços são reunidos.
Quando Fowler descreveu o teste em seu livro, ele se referiu a testar cada classe com seu próprio método principal. Ele melhorou isso, mas o conceito ainda é o mesmo - você testa toda a classe para que ela funcione como um todo; todos os seus testes são agrupados para provar a interação de todos esses métodos, para que a classe possa ser reutilizada com expectativas definidas.
Acho que os kits de ferramentas de teste nos fizeram um desserviço, nos levaram a pensar que o kit de ferramentas é a única maneira de fazer as coisas quando, na verdade, você precisa pensar mais para obter o melhor resultado do seu código. Colocar cegamente o código de teste nos stubs de teste para pequenos pedaços significa apenas que você deve repetir seu trabalho em um teste de integração de qualquer maneira (e se você quiser fazer isso, por que não pular completamente a etapa agora redundante de teste de unidade)? Isso também significa que as pessoas perdem muito tempo tentando obter 100% de cobertura de teste e muito tempo criando grandes quantidades de códigos e dados simulados que seriam mais bem gastos, facilitando o código para o teste de integração (ou seja, se você tiver muito dependências de dados, o teste de unidade pode não ser a melhor opção)
Por fim, a fragilidade dos testes de unidade baseados em métodos apenas mostra o problema. A refatoração foi projetada para ser usada com testes de unidade. Se seus testes são interrompidos o tempo todo porque você está refatorando, algo deu errado com toda a abordagem. A refatoração gosta de criar e excluir métodos, portanto, obviamente, a abordagem de teste cega por método não é o que foi originalmente planejado.
Não tenho dúvidas de que muitos métodos terão testes escritos para eles, todos os métodos públicos de uma classe devem ser testados, mas você não pode se afastar do conceito de testá-los juntos como parte de um único caso de teste. Por exemplo, se eu tiver um método set e get, posso escrever testes que colocam os dados e verificar se os membros internos estão definidos ok, ou posso usar cada um para colocar alguns dados e retirá-los novamente para ver se ainda o mesmo e não ilegível. Isso está testando a classe, não cada método isoladamente. Se o setter depende de um método particular auxiliar, tudo bem - você não precisa zombar do método privado para garantir que o setter esteja funcionando, não se você testar a classe inteira.
Eu acho que a religião está entrando nesse tópico, portanto, você vê o cisma no que é agora conhecido como desenvolvimento 'orientado pelo comportamento' e 'orientado a testes' - o conceito original de teste de unidade era para desenvolvimento orientado a comportamentos.