Я реализовывал интерфейсы Hibernate и JPA для тестирования, подкрепленного картой карт. Эта структура данных делает действительно простую «базу данных»:
// All my database classes implement this (Kotlin) interface.
// "Idd" means "having an ID" as in "ID'd"
interface Idd {
val id: Long
}
// This simple data structure works as an in-memory database.
//
// The Class is the name of the mapped entity class (which extends Idd)
//
// The inner map uses the ID as the key and the actual objects as
// the value.
//
// ID's are assigned by looking up the Class in the outer map
// and adding one to the size of the inner map (in a synchronized block).
map: SortedMap<Class<Idd>,
MutableMap<Long, Idd>>
Я обертываю EntityManager в Hibernate, чтобы тест мог передать ему новую карту вместо подключения к реальной базе данных. Я передаю ему отдельную карту для каждого теста и настраиваю тест на любые необходимые данные, чтобы тесты, выполняющиеся одновременно в разных потоках, были полностью отделены друг от друга.
Это прекрасно работает (это был своего рода прорыв в моем тестировании), но соответствующие классы Hibernate / JPA имеют много методов и довольно сильно меняются между версиями Hibernate.
Я слышал, что Hibernate поставляется с базой данных в памяти. Может ли это использоваться с отдельной базой данных для каждого потока для тестирования? Пример был бы великолепен!
P.S. Я использую Sorted / Tree-Map, потому что могу распечатать ее в надежном порядке для отладки.