Over the past year or so I have been developing my TDD chops so that I am now fairly good at the essentials - writing tests first, mocking frameworks, testing as small things as possible, DI etc.
However I feel like there are still a lot of things that I am not getting out of unit testing.
For example, I often find that unit testing in this way does not really test the integration and overall bigger picture of what my code is supposed to be doing. With everything mocked out I find that I lose sight of whether or not the methods under test are producing the results that I actually need, rather than just the results they say the will provide. As I start to move towards BDD I find that this problem is only exacerbated, resulting in wasted development time and ineffective tests.
Another problem is that unit tests require a large amount of maintenance to keep them orderly, slowing down refactoring.
When I first started unit testing, like most people I found that what I was writing were really integration tests. However there were many benefits to these tests - they were much easier to read and acted as decent documentation on my programs API. They also tended to catch real world problem much faster, rather than unit tests which I find spend to much time targeting edge cases that would only arise through incorrect use of the API (e.g. null references, divides by 0 etc).
What are your thoughts? Can you recommend good books, articles or practices that tackle more advanced unit testing and maintaining productivity and effectiveness?
EDIT: Just a little follow questions, given the answers: So basically you're saying that despite doing all this unit 'testing' I'm not really be testing the code... to which I reply, 'But I want to test the dang code!' In fact, when I wrote lots of 'heavier' integration tests I found that my code tended to reach a state of correctness much quicker, and bugs were identified much earlier. Is it possible to achieve this without the maintainability problems of integration tests?