Nota do moderador: já existem 39 respostas postadas aqui (algumas foram excluídas). Antes de postar sua resposta, considere se você pode ou não adicionar algo significativo à discussão. É mais do que provável que você apenas repita o que alguém já disse.
Ocasionalmente, preciso me tornar um método privado em uma classe pública apenas para escrever alguns testes de unidade para ele.
Normalmente, isso ocorre porque o método contém lógica compartilhada entre outros métodos da classe e é mais organizado testar a lógica por conta própria, ou outro motivo pode ser possível: desejo testar a lógica usada em encadeamentos síncronos sem ter que se preocupar com problemas de encadeamento .
Outras pessoas se veem fazendo isso, porque eu realmente não gosto de fazer isso? Pessoalmente, acho que os bônus superam os problemas de tornar público um método que realmente não fornece nenhum serviço fora da classe ...
ATUALIZAR
Obrigado por responder a todos, parece ter despertado o interesse das pessoas. Penso que o consenso geral de que os testes devem ocorrer por meio da API pública, pois é a única maneira de uma classe ser usada, e eu concordo com isso. Os dois casos que eu mencionei acima, onde eu faria isso acima, eram casos incomuns e achei que os benefícios de fazer isso valeram a pena.
No entanto, posso ver que todos apontam que isso nunca deveria realmente acontecer. E, quando penso um pouco mais sobre isso, acho que mudar seu código para acomodar testes é uma péssima idéia - afinal, suponho que o teste seja uma ferramenta de suporte e que mude um sistema para 'suportar uma ferramenta de suporte', se quiser, é flagrante má prática.
@VisibileForTesting
anotação para fazer esses métodos - eu recomendo que você faça isso para que o motivo do método não private
seja devidamente documentado.