In reality, you should do both. When you say "build database stub", that hints at mocking in unit tests. And when you talk about "Install a QA database (known-starting point)", that hints at integration tests where you actually hit the database. Unit tests come much earlier in the game and are where mocking comes into play. Mocking is much faster than actually hitting the database. So when you run many unit tests, mocking will save much time. Rhino Mocks is a great framework that I've used personally. But there are several mocking frameworks, find the one that works best for you.
At some point you should put your full database through integration tests, and the best way I've found for that is to have a script that completely creates and populates the database with a known set of data. Then make sure that nothing is going to touch your newly created database except for the integration tests, and test away.