Don't write strict unit tests where you mock all the dependencies. Some people will tell you these aren't real unit tests. Ignore them. These tests are useful, and that's what matters.
Let's look at your example:
public class MyDocumentService {
...
public List<Document> findAllDocuments() {
DataResultSet rs = documentDAO.findAllDocuments();
List<Document> documents = new ArrayList<>();
for(DataObject do: rs.getRows()) {
//get row data create new document add it to
//documents list
}
return documents;
}
}
Your test probably looks something like this:
DocumentDao documentDao = Mock.create(DocumentDao.class);
Mock.when(documentDao.findAllDocuments())
.thenReturn(DataResultSet.create(...))
assertEquals(..., new MyDocumentService(documentDao).findAllDocuments());
Instead of mocking DocumentDao, mock its dependencies:
DocumentDao documentDao = new DocumentDao(...db);
Mock.when(documentDaodb.findAllDocuments()..)
.thenReturn(DataResultSet.create(...))
assertEquals(..., new MyDocumentService(documentDao).findAllDocuments());
Now, you can move logic from MyDocumentService
into DocumentDao
without the tests breaking. The tests will show that the functionality is the same (so far as you've tested it).