The difference between
expect my_func to call thing.method
and
expect my_func to return a call_thing_method
Might not seem like much except that the implementation of indirection is one that is in place during production and whole-system tests - a genuine article - and not one that is only in place during unit testing.
An indirection that behaves contrary to how it's expected to but is used in production or whole-system testing can be found, a faulty indirection that exists only during a particular unit test goes unnoticed
You can separately test the code that accesses the database, but maybe it's not as complete as it should be, just like in the layered architecture.
Fundamentally, we still have a layered architecture, with the connections between layers represented differently.