Я собираю данные и храню эти данные в базе данных MySQL, используя Java. Кроме того, я использую Maven для сборки проекта, TestNG в качестве тестовой среды и Spring-Jdbc для доступа к базе данных. Я реализовал слой DAO, который инкапсулирует доступ к базе данных. Помимо добавления данных с использованием классов DAO, я хочу выполнить некоторые запросы, которые агрегируют данные и сохраняют результаты в некоторых других таблицах (например, материализованных представлениях).
Теперь я хотел бы написать несколько тестовых примеров, которые проверяют, работают ли классы DAO должным образом. Поэтому я подумал об использовании базы данных в памяти, которая будет заполнена некоторыми тестовыми данными. Поскольку я также использую специфичные для MySQL SQL-запросы для агрегирования данных, у меня возникли некоторые проблемы:
- Во-первых, я думал просто использовать функциональность встроенной базы данных, предоставляемую Spring-Jdbc, для создания экземпляра встроенной базы данных. Я решил использовать реализацию H2. Там я столкнулся с проблемой из-за запросов агрегации, которые используют специфичный для MySQL контент (например, функции управления временем, такие как DATE()). Еще одним недостатком этого подхода является то, что мне нужно поддерживать два файла ddl: фактический файл ddl, определяющий таблицы в MySQL (здесь я определяю кодировку и добавляю комментарии к таблицам и столбцам, обе функции зависят от MySQL); и тестовый файл ddl, который определяет те же таблицы, но без комментариев и т. д., поскольку H2 не поддерживает комментарии.
- Я нашел описание использования MySQL в качестве встроенной базы данных, которую я могу использовать в тестовых примерах (http://literatitech.blogspot.de/2011/04/embedded-mysql-server-for-junit-testing.html). . Это звучало очень многообещающе для меня. К сожалению, это не сработало: возникло сообщение MissingResourceExcpetion «Ресурс 5-0-21/Linux-amd64/mysqld» не найден». Кажется, что драйвер не может найти демон базы данных на моей локальной машине. Но я не знаю, что мне нужно искать, чтобы найти решение этой проблемы.
Теперь я немного застрял, и мне интересно, должен ли я создавать архитектуру по-другому. У кого-нибудь есть несколько советов, как мне настроить соответствующую систему? Я имею в виду еще два варианта:
- Вместо встроенной базы данных я возьму собственный экземпляр MySQL и настрою базу данных, которая используется только для тестовых случаев. Этот вариант звучит медленно. На самом деле, я мог бы захотеть настроить сервер CI позже, и я подумал, что использование встроенной базы данных будет более подходящим, поскольку тест выполняется быстрее.
- Я удаляю из SQL-запросов все, что связано с MySQL, и использую H2 в качестве встроенной базы данных для тестирования. Если этот вариант является правильным выбором, мне нужно будет найти другой способ тестирования SQL-запросов, которые объединяют данные в материализованные представления.
- Или есть 3-й вариант, который я не имею в виду?
Буду признателен за любые подсказки.
Спасибо, XComp.