Тоже интересуюсь этим вопросом, но пока не видел особо интересных решений. По ощущениям, хорошо тестируемая связь с БД это ActiveRecord. Либо, более гибко, но с теми же минусами — конструктор запросов (а-ля, для PHP, $db->select()->where()->...).
Основная проблема — потеря гибкости и эффективности: все варианты записи и выборки приходится сводить к тем, которые понимают базовые классы, и которые, соответственно, тестируются. Т.е. не получится использовать для отдельных случаев расширенные фичи СУБД, если они не заложены в методах класса (FORCE INDEX? подзапросы?). ActiveRecord, в случае PHP, ещё и получается накладен для процессора и памяти.
Есть, конечно, вариант реализовать стандартные методы в базовых классах, а для особых случаев определять в классах конкретных объектов и тестировать уже там.
Выборка из нескольких таблиц, как мне кажется, — не принципиальное препятствие для ActiveRecord, т.к. можно определить для этого в коде стандартные средства.
Другой вариант, как развитие конструктора запросов — это собственный язык запросов, вроде того, что есть в Doctrine. У меня не дошло до его использования, но могу предположить, что в свой язык/конструктор можно закладывать последовательно всё больше функционала, бесконечно приближая его к SQL (и, соответственно, идеал — это полностью покрытый тестами парсер нужного диалекта SQL, переводящий запросы в методы языка программирования).
Не знаю, как в .net'е с собственными языками запросов. Слыхал, что там для этого есть нечто под названием LINQ.
По причинам прагматического (медленно и объемисто) и личностного (зачем мне этот геморрой) характера, ни ActiveRecord, ни конструкторы/языки запросов в текущих весьма нагруженных проектах не применяю, а других выходов не встречал. Поэтому остается только тестировать конкретные модели, дублируя методы с выполнением в памяти.
Если честно, то пока и это не внедрено, а модели ползают в базу даже в тестах. Чтобы тесты выполнялись за разумное время, есть желание поднять базу в памяти, а так как на поддержку фирменных MySQL'евых расширений в каком-нибудь HSQLDB я не рассчитываю, то это будет MySQL на tmpfs.