Obviously, changing function calls at run time is not the only way to overcome the above problems. The important thing is using good testing principles, rather than a particular implementation.
I think it is a useful and powerful tool for certain kinds of testing.
When's the last time you used duct tape on a duct? --Larry Wall