Имитация / Mock базы данных MySql для модульного тестирования

0

Для наших приложений мы создали серию healthchecks. Одна из этих проверок работоспособности проверяет, запущена или запущена база данных MySql. Для модульной проверки этой функциональности мне нужно высмеять или смоделировать базу данных и запустить проверку работоспособности.

Чтобы установить соединение с проверяемой базой данных MySql, мы используем DriverManager.getConnection(). Поэтому мы сначала попытались высмеять возвращаемое значение getConnection(). Тем не менее, это статический метод, и Mockito не может издеваться над ним. Затем мы обратились к Powermock, потому что он способен издеваться над статическими методами. К сожалению, мы обнаружили, что он плохо поддерживается JUnit5, и нам пришлось загромождать наш pom с большим количеством зависимостей. Не говоря уже о том, что код стал слишком сложным. В конце концов, мы решили искать другие варианты, кроме насмешек.

В принципе, наша проверка работоспособности должна убедиться, что URL-адрес MySQL, имя пользователя и пароль верны, и база данных будет принимать соединение. В идеале наши модульные тесты будут отражать эти требования.

Таким образом, наша следующая идея заключается в том, чтобы использовать базу данных в памяти, как этот один из Baeldung. Это похоже на отличный вариант, но я волнуюсь, что он не будет вести себя так же, как и настоящая база данных MySQL. Есть ли способ создать базу данных MySql в памяти и установить соединение с DriverManager.getConnection()? Это эффективно имитирует нашу проверку работоспособности

  • 0
    Другой вариант - плагин jcabi mysql maven: mysql.jcabi.com, обратите внимание, версия> 0.7 не работает в Windows. (Я буду расширять в ответ)
  • 0
    Если вы действительно хотите протестировать MySQL, то почему бы не развернуть выделенную тестовую базу данных где-нибудь?
Показать ещё 6 комментариев
Теги:
unit-testing
powermock
mockito

1 ответ

0

Один из вариантов - использовать плагин mysql jcabi maven: mysql.jcabi.com

Обратите внимание, что версия> 0.7 не работает в Windows.

Это фактически установит экземпляр MySQL, поэтому он позволяет тестировать очень специфичные вещи mysql, хотя первый запуск выполняется медленно.

Итак, несколько вопросов помогут вам ответить на ваш вопрос: вы делаете что-то особенное для MySQL? Вы хотите, чтобы ваше приложение было переносимым для других БД?

Если ответ "да" на первый, а второй на второй, вероятно, используйте плагин jcabi.

Если ответ не соответствует первому, а да - второму, вы, вероятно, довольно безопасны, используя H2.

Если ответ "да" обоим, у вас больше проблем :).

Обычно я стараюсь, чтобы мой код отсутствовал от специфики поставщика БД и использовал библиотеки, такие как JPA, чтобы абстрагировать это. Затем я могу предположить, что JPA (и impl) протестировали по поддерживаемым БД, и я достаточно хорош, чтобы запускать тесты на единицу и интеграцию с БД в памяти, например H2.

У меня обычно также есть некоторые сквозные тесты в prod-подобном env с той же настройкой БД, что и prod, чтобы охватить любые специфические особенности конкретного поставщика.

  • 0
    Наша проверка здоровья будет иметь разные методы для разных баз данных. Так что да, он будет переносимым, но если нам нужно проверить работоспособность другого БД, мы напишем еще один тест
  • 0
    Я бы посоветовал вам использовать плагин jcabi maven.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню