A pergunta faz referência especificamente ao "teste da caixa branca". É aqui que seus testes têm conhecimento íntimo da estrutura interna do seu código e afirmam o comportamento a cada etapa, em vez de apenas o efeito de entrada / saída / lado (teste de caixa preta). Embora o JUnit seja excelente para fazer as duas coisas, você precisa de estruturas adicionais adicionais para fazer isso no contexto de um teste de unidade.
EasyMock e JMock são boas estruturas para fazer isso. Eu costumo favorecer JMock.
Correndo o risco de iniciar um debate no AT, você deve pensar cuidadosamente nas implicações do teste da caixa branca. Os testes de caixa branca estão intimamente ligados ao seu código (obviamente) e, se não forem usados com cuidado, as estruturas de zombaria podem fazer com que seus testes sejam bastante complicados, difíceis de ler e tendem a ser mais frágeis ao refatorar.
Eu costumo me ater a uma mistura de ambos. Testes de caixa preta sempre que possível e testes de caixa branca aplicados com moderação a códigos mais arriscados / mais complicados.
Obviamente, as estruturas listadas acima também podem ser usadas em testes de caixa preta, em que o número de classes contribuintes (injetadas) é grande e o stubbing simples se torna pesado.
Em relação ao TDD - é principalmente uma abordagem de aprimoramento de design para escrever código, em vez de simplesmente uma maneira de escrever testes. Os testes que você realiza no final são uma saída importante, mas, além disso, a abordagem visa aprimorar o design e a estrutura de sua aplicação.