Тестирование единиц с помощью Mock EntityManager при использовании JPA в Play
-
21-12-2019 - |
Вопрос
У меня есть некоторые (Scala) код в пьесе, который использует JPA для доступа DB.Работает отлично.Но я хочу установить тестирование моего кода, который потребуется использовать Mock EntityManager.Это возможно?
Мой тест написан в SPECTS2 (расширяя воспроизведение) и работает с JUNIT.Я использую Mockito, чтобы издеваться от EntityManager.Но я ожидаю, что смогут сделать это с другими рамками.
Вот что выглядит мой код:
object MyThing {
def create(...) : MyThing = {
val newThing = ...
JPA.withTransaction(new play.libs.F.Function0[Unit]() {
def apply() = {
JPA.em().persist(newThing)
}
})
return newThing
}
}
.
Если невозможно установить тестирование этого кода, есть ли какой-то альтернативный подход к доступу к данным, который рекомендуется?
Решение
Видимо нет никакого способа использовать Mock Entitymanager здесь, по крайней мере, не так, как я мог найти. Поэтому мне пришлось пересмотреть свой дизайн.
SARGENT SARGENT THEMSAFE предложил создать отдельный подпроект постоянного преобразования БД в списке рассылки: https://groups.google.com/d/msg/play-framework/1u-_jbtiuqg/l5_9O4ycfomj . Я не пошел совсем так далеко, но я нашел решение, который работал для меня, определяя отдельный интерфейс DAO.
Я поставил весь код JPA в черту DAO - вся реализация там. Существует также объект компаньона для предоставления экземпляра Singleton. Как так:
trait MyThingDAO {
def create(...) : MyThing = { ... }
}
object MyThingDAO extends MyThingDAO
.
Теперь я меняю свои контроллеры, чтобы черт, со ссылкой на дао левый unset. Объект компаньона устанавливает экземпляр DAO к объекту Singleton. Это позволяет избежать вносить какие-либо изменения в файл маршрутов (не нужно создавать контроллеры). Как так:
trait MyThingController {
val myThingDao : MyThingDAO
def myAction = Action { implicit request => ... }
}
object MyThingController {
val myThingDao = MyThingDAO
}
.
Так что все работает достаточно легко со стандартным кодом JPA, когда приложение работает. Но когда я хочу установить тест, я могу вставить модель Mock Dao так (это использует Mockito):
...
val mockDao = mock[MyThingDAO]
val controller = new MyThingController() { val myThingDao = mockDao }
...
.
Может быть, это не идеальный подход, но он до сих пор работает. Мне все равно интересно услышать какие-либо другие предложения.