#1. Want to create objects with messed up states. If collaborating objects actually change the state, ensure that these objects are injected. This means you can inject a test version in that will mess with the states for you.
#2. Encapsulation you say, are you programming to interfaces? On your business object make all the getters default scope, atleast that way in your unit tests you can access them to make assertions. Ensure all of the code knows nothing about the actual domain object and only ever has references to the interface. If you ensure that the static factory methods return the interface as well, there should be very few direct calls to the REAL domain object.