Se você quer dizer privado da maneira que eu acho, então não - você não deveria estar testando a unidade. Você deve apenas testar / observar o comportamento / estado da unidade. Você pode estar perdendo o ponto por trás do ciclo "vermelho-verde-refator" do TDD (e se você não estiver testando primeiro, aplica-se o mesmo princípio). Depois que os testes são escritos e passam, você não deseja que eles sejam alterados durante a refatoração. Se você for forçado a testar a unidade de funcionalidade privada, provavelmente isso significa que os testes de unidade em torno da funcionalidade pública são falhos. Se for difícil e complexo escrever testes em torno do código público, talvez sua classe esteja fazendo muito ou seu problema não esteja claramente definido.
Pior ainda, com o tempo, seus testes de unidade se tornarão uma bola e uma corrente que o desacelerarão sem agregar nenhum valor (alterar a implementação, por exemplo, otimização ou remoção de duplicação, não deve afetar os testes de unidade). O código interno deve, no entanto, ser testado em unidade, pois o comportamento / estado é observável (apenas de maneira restrita).
Quando fiz o teste de unidade, fiz todos os tipos de truques para testar coisas particulares, mas agora, com alguns anos de experiência, vejo isso pior do que uma perda de tempo.
Aqui está um exemplo bobo, é claro que na vida real você teria mais testes do que estes:
Digamos que você tenha uma classe que retorna uma lista classificada de strings - você deve verificar se o resultado está classificado, não como ele realmente classifica essa lista. Você pode iniciar sua implementação com um único algoritmo que apenas classifica a lista. Feito isso, seu teste não precisará ser alterado se você alterar seu algoritmo de classificação. Neste ponto, você tem um único teste (supondo que a classificação esteja incorporada na sua classe):
- Meu resultado está classificado?
Agora, digamos que você queira dois algoritmos (talvez um seja mais eficiente em algumas circunstâncias, mas não em outras), então cada algoritmo pode (e geralmente deve) ser fornecido por uma classe diferente e sua classe os escolhe - você pode verificar se isso está acontecendo seus cenários escolhidos usando zombarias, mas seu teste original ainda é válido e, como estamos verificando apenas o comportamento / estado observável, ele não precisa ser alterado. Você acaba com 3 testes:
- Meu resultado está classificado?
- Dado um cenário (digamos que a lista inicial esteja quase ordenada para começar), é feita uma chamada para a classe que classifica seqüências de caracteres usando o algoritmo X?
- Dado um cenário (a lista inicial está em uma ordem aleatória), é feita uma chamada para a classe que classifica seqüências de caracteres usando o algoritmo Y?
A alternativa seria começar a testar o código privado dentro da sua classe - você não ganha nada com isso - os testes acima me dizem tudo o que preciso saber no que diz respeito ao teste de unidade. Ao adicionar testes particulares, você está construindo uma jaqueta reta, quanto mais trabalho seria se você não apenas verificasse se o resultado foi classificado, mas também como é classificado?
Os testes (desse tipo) só devem mudar quando o comportamento mudar, começar a escrever testes em relação ao código privado e sair pela janela.