Если вы используете что-то вроде Hibernate, например, и если у вас есть какая-либо логика в DAO, вы можете смоделировать вызовы, например, Session and Query и unit-тест, не затрагивая базу данных.
Если вы хотите протестировать сами запросы, вы можете использовать базу данных в памяти и что-то вроде DbUnit. Я бы посчитал их интеграционными тестами и запускал их отдельно, поскольку они, как правило, занимают больше времени.
Вот пример типичного метода Java Spring / Hibernate DAO с некоторой логикой, которую вы, возможно, захотите проверить:
public List<Entity> searchEntities(final String searchText, final int maxResults) {
String sql = "select * from entity where field like :text";
Query query = sessionFactory.getCurrentSession().createSQLQuery(sql);
if (maxResults != 0) {
query.setMaxResults(maxResults);
}
query.setString("searchText", "%"+searchText+"%");
return query.list();
}
Используя фальшивый фреймворк, вы могли бы имитировать sessionFactory, сеанс и запрос и создать модульный тест, который ожидает, что query.setMaxResults вызывается только в том случае, если он не равен 0, а этот query.setString с правильным значением строки. Вы также можете утверждать, что все, что возвращается из query.list () - это то, что возвращается методом.
Однако , это заставляет вас тестировать код, связанный с вашей реализацией этого метода. Кроме того, если в вашем методе DAO много логики, вам следует подумать о рефакторинге и, возможно, переместить эту логику на уровень обслуживания, где вы можете тестировать ее отдельно от любого взаимодействия с базой данных.