Kotlin / Java – тестирование данных базы данных REST API

Я пытаюсь проверить подключение к моей базе данных и пытаюсь настроить базу данных Mock. Я понятия не имею, как это сделать. Как можно с какой-либо тестовой инфраструктурой издеваться над базой данных и тестировать мой метод (показано ниже) getUserById ?

Поскольку это использует raw jdbc, как я могу перезаписать этот метод getConnection() чтобы использовать базу данных mock вместо реального? Или это не путь?

Я никогда не тестировал подключение / вывод базы данных API, поэтому я не знаю с чего начать.

Это мой класс jdbc:

 import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet import java.sql.Statement import java.util.ArrayList import java.util.Properties import bye.domain.* class jdbcTrial { val url: String = "jdbc:postgresql://196.21.2.12:5432/events" //val props: Properties = Properties(); val DB_DRIVER = "org.postgresql.Driver"; // used for getting the comments fun getUserById(id: Int): User { val query = "select * from user where id = ${id};"; return getSingleUser(query) } /* Singles */ fun getSingleUser(query: String): User { val conn = this.getConnection() var user = User() val statement: Statement = conn.createStatement() val rs: ResultSet = statement.executeQuery(query) while (rs.next()) { user = convertToUser(rs) } return user } /* Converting */ fun convertToUser(rs: ResultSet): User { val id = rs.getInt("id") val uname = rs.getString("username") val type = rs.getString("usertype") return User(id, uname, type) } fun getConnection(): Connection { Class.forName(DB_DRIVER).newInstance() val conn: Connection = DriverManager.getConnection(url, "username", "password") return conn } } 

в реальном мире вы можете увидеть, по крайней мере, следующие способы:

  1. вы его не проверяете. код прост, тесты db могут быть дорогими, медленными и т. д.
  2. ручные тесты на одном общем удаленном экземпляре. довольно бесполезно, поскольку это не позволяет вам (или делает это действительно сложно) экспериментировать с изменением схемы, удалением таблиц, данных и т. д.
  3. для тестов используется in-memory db (h2, hsql и т. д.). он позволяет вам начать довольно легко, потому что он запускает и останавливает db по требованию. проблемы: вам все равно придется очистить db между транзакциями (если вы выполняете транзакционные тесты, вы можете использовать фреймворки, такие как dbUnit, или иметь полный контроль и делать это вручную), и на самом деле вы не проверяете свой db. вы проверяете некоторые другие db
  4. используйте тот же поставщик услуг db, что и db производства. это лучшие тесты, но нужно немного подумать о настройке инфраструктуры: вы должны начать свой db для тестов (автоматический запуск docker? ручной запуск? постоянно установленный локальный / удаленный db?), вы должны подготовить db перед каждым тестом (схема, таблицы, исходные данные, очистка существующих данных, последовательности сброса и т. д.) и закрыть их после тестов.

я рекомендую использовать последнее:

  1. перед установкой всех тестов, которая пытается подключиться к существующему db, и если нет прослушивания db, тогда он начинает докер с этим db
  2. flyway, который создает структуру схемы и db
  3. устанавливает тесты, которые очищают все данные, повторяют последовательности и т. д. перед каждым тестом
  4. каждый тест вставляет данные, которые понадобятся во время этого теста
  5. jvm shutdown hook, который останавливает докер, если он был запущен в начале