I've been stewing over this issue for a while especially with trying my hand at TDD.
I've come across two posts that I think address this problem thoroughly enough in the case of TDD.
- Testing private methods, TDD and Test-Driven Refactoring
- Test-Driven Development Isn’t Testing
In Summary:
When using test driven development (design) techniques, private methods should arise only during the re-factoring process of already working and tested code.
By the very nature of the process, any bit of simple implementation functionality extracted out of a thoroughly tested function will be it self tested (i.e. indirect testing coverage).
To me it seems clear enough that in the beginning part of coding most methods will be higher level functions because they are encapsulating/describing the design.
Therefore, these methods will be public and testing them will be easy enough.
The private methods will come later once everything is working well and we are re factoring for the sake of readability and cleanliness.