The question specifically makes reference to "white box testing". This is where your tests have intimate knowledge of the internal structure of your code and assert behaviour at each step rather than just the input/output/side effect(black box testing). Whilst JUnit is excellent to do both, you need further additional frameworks in order to do this within the context of a unit test.
EasyMock and JMock are good frameworks to do this. I tend to favour JMock.
At the risk of starting a OT debate, you should think carefully about the implications of white box testing. White box tests are intimately tied to your code (obviously), and if not used carefully, mocking frameworks can cause your tests to be rather complicated, difficult to read and tend to be more brittle when refactoring.
I tend to stick to a mix of both. Black box tests wherever possible, and white box tests sparingly applied to riskier/more complicated code.
Of course the frameworks listed above can also be used in black box tests where the number of contributing (injected) classes is large and simple stubbing becomes unwieldly.
Regarding TDD - it's primarily a design enhancing approach to writing code, rather than simply a way of writing tests. The tests you have at the end are an important output, but moreover the approach is intended to enhance the design and stucture of your application.