I'm using
JUnit attaching to an in-memory instance of Derby.
The production system uses DB2, and there are a few cases where the difference between DB2 and Derby cannot be unit-tested, but overall it works well.
JUnit can also roll back changes after a test so even if you use a permanent database for testing, the tests can be made to run from a consistent baseline instead of continuously polluting the test database.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.