I would tend to use the real classes if you can.
I would mock in scenarios where I can't instantiate those classes, or they require interaction with databases or other remote systems. However if you can use the real dependent classes with no penalty (construction or performance) then that seems a decent approach to reliable testing.