For unit testing, my company has adopted a fairly good strategy: we have a tiered application (Data Layer, Service Layer/Business Objects, Presentation layer).
Our service layer is the ONLY way to interact with the database (via methods in the data layer).
Our goal is to have at least a basic unit test in place for each method in the service layer.
It's worked well for us - we don't always thoroughly check every code path (especially in complex methods) but every method has it's most common code path(s) verified.
Our objects are not unit tested, except incidentally via the service layer tests. They also tend to be 'dumb' objects - most have no methods except those required (such as Equals() and GetHastCode()).