Test behavior not implementation is my motto. I like cleanly separate the external resources and test them with integration tests that reused as a shared specification to implement in memory representation. With that being done, I don't have to use any mock/stub anymore, and my tests only aim to do behavior testing through composition.
Of course this requires a small amount of self discipline, but so far (in the past years) I only have good experiences with it.
The only "con" with it that each time an external resources needs to be added to the system, there is an extra step for creating an in memory implementation as well by shared specs.
But I'm a simple man. I see post about TDD, I upvote :)
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.