If A depends on B depends on C, then:
* C should have a unit test proving its capabilities.
* B is allowed to have a unit test that depends on C (because C's unit tests prove its correctness).
* A is allowed to have a unit test that depends on B (similar to the B/C case).
---------
It seems like mocking was a way to "cut" the dependency between A and C. In particular, you usually get huge "dependency chains" between your code base. A depends on B, depending on C, depending on D... depnds on E, F, G, H, I... etc. etc. Pulling in all of this code for a unit test seems backwards. IMO, the solution isn't to use mocking, but to refactor your code to reduce the dependencies.
But if the code is outside of your control (ie: owned by another team, or even a 3rd party), maybe mocking is the best option.
"Flattening" your code dependencies, reducing the "height" of your layers will simplify your code logic and software engineering. But its not always an option in reality.
------
If you have a circular dependency: A depends on B and B depends on A, then:
1. Find a way to break the circular dependence. Invent a new class C: Maybe A depends on C, B depends on C, and C represents the shared interface between the two. Once broken up in this manner, A depends on C (and A unit tests depend on C), then B depends on C (and B unit tests depend on C), and finally you write unit tests for C itself. No mocking needed.
2. If #1 cannot happen, Both A and B must be unit tested together as a singular component. Trying to split it up using mocking is a fool's errand.