This is why I feel that testing classes in this detail is fundamentally a bad idea.
It break encapsulation.
Testing works because it is a dispassionate appraisal of the function of a unit from the perspective of the specification, rather than the programming. When writing tests from the perspective of a programmer, you can defeat that purpose.
Who will write the unit test?
If it is the person who wrote the class then he will already have his own idea of how the algorithm works and what values should be where. He will likely write the test to accommodate most of the bugs he introduced to begin with making the test just as buggy as the code and, worse, giving the buggy code a free pass.
If it is someone who did not write the class how will they know what private members should and should not contain? That person will have to examine the internal algorithm in order to discover what values need to be in the private members at what points. They too are likely to be influenced by what the code says rather than what the specification requires. They too may introduce the very bugs that are in the code into the tests giving them a free pass.
The bottom line is that I feel testing classes from the perspective of the implementer is inherently flawed and invites tests that are themselves just as buggy as the code they are testing.
Having a second pair of eyes look over/co-develop the code is a good thing but that's for the coding phase, not the testing.
Tests should be designed from the perspective of the specification and they should be about breaking the contract. They should not be about your ability to spot bugs in an algorithm. That is the programmer's job if the test fails. The tester's job is to focus on cause and effect based on external stimuli. The question they should be asking is "Does the class do what it is advertised as doing?" not "Is the code doing it properly?".
That is not to say the programmer should not code with testing in mind. Classes can be designed to make their contracts more testable. But the person writing the test should not know, or care, how the class does what it does, only that it does it correctly according to specification.
When it comes to testing, specification is king, not implementation.
So I think testing is effective when you are pitting implementation against specification. If you get into looking at the implementation then you start pitting one person's idea of how an implementation should work against another's idea of how an implementation should work and they run the risk of either introduce their own implementation bug into the test or else reinforce the original programmers bug.