To what extent should I be looking to test private methods, if at all?
Private methods are implicitedly tested when testing your public methods. There shouldn't be a need to write specific unit tests for them.
To what degree should mock objects be used?
Do whatever it takes to test. Mock component can help isolate certain layers of your code. We try and unit test each layer independently so they can be useful. But, if you can try and test combinations of layers as well. We also have Unit Tests that validate output through multiple layers also. We've also designed specific unit test logging that can be used as validation points in-between components.
If I don't have time to UT all of the code, where do I concentrate my efforts?
Concentrate on your core components. You should have a framework layer somewhere in your design. These components are critical to all business logic and are also the easiest to unit test.
Why do my tests keep breaking when I change my code, and isn't it too expensive to fix?
If you keep breaking your unit tests you must not have a very good design to begin with. Most modern programming languages have plenty of capability to maintain backward compatability of new releases. If you are constantly breaking your unit tests you likely don't have a good design process. Creating quality software requires you to be good at all methodologies. You can't expect Unit Testing to compensate for your lack of quality designs.
If I make a mistake in my code, aren't I likely to also make the same mistake in my tests?
All Unit Tests need to have verification points. If you code this validation wrong, your test would likely fail when there is no bug in your software. Whenever a test fails you need to find out why. The alternative is that you accidently make a test pass that should have failed. The way to avoid this is to create both positive and negative scenarios for each test case. It's highly unlikely that a positive test would return a false positive and a negative test could return a false negative for the same test case.
The better question to ask is how can I be sure my tests are comprehensive. This is where the real challenge is. You need to look at all of your use cases supported by a specific interface and make sure you cover all of them. Defining the right test cases can be complex. Missing a scenario that could occur in real-worl usage can be common. The good thing about unit testing is that if you find out you missed something, you can just plug the hole later. Over time you have a comprehsive test suite that you can have confidence in.
If method A calls method B aren't I breaking the isolation principle by testing A?
Yes. But, so what? Is this supposed to be an argument against unit testing? The goal of creating unit tests is to build a test suite that you can use to have confidence in your software. IMO, it doesn't matter how you do it. Taking some sort of purist view is completely pointless in my book.
What if the class under test is laborious to setup?
Unit Tests are automated so the setup should be a one time effort. The alternatives are to manually setup a test of laborious system over and over again. Build some common utilities to help you automate testing. We've built communications tools, serialization services, and other services utilized by our Unit Test framework. Certain scenarios wouldn't even be possible to test without them. But they would be hard or even impossible to test without them. What other option is there? Not to test at all?
What can I test for, using mocking, that I can't test for without it?
Whatever makes sense goven the funcitonality of the components being tested. There are no hard and fast rules.
What if my dependency is a sealed class and has no interface?
You mean a C# sealed class? A sealed class can't be inherited. Having no interface on this class makes no sense? How could anyone use this class? Did you mean an abstract class? You can test an abstract class by having your test harness inherit it.
How do I test the logic in my user interface?
Don't have logic in your user interface. Separate your UI and your business logic and test your business logic using unit tests. This is the better way to design your code anyway. You can easily change UI technologies and be sure that you have quality business logic that is unaffected.
You haven't mentioned anything about continuous integration yet? Continuous integration is another good reason to have quality unit test suites. There are many CI systems that can integrate with source control and build systems. The basic concept is that you can conitinually run unit tests with every build to immediately ensure that they past with every change youy check in. This is a powerful way to identify issues early in the development cycle. Google "Cruise Control" for more info.