Тестирование единиц с помощью Mock EntityManager при использовании JPA в Play

StackOverflow https://stackoverflow.com//questions/22055172

Вопрос

У меня есть некоторые (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 }
...
.

Может быть, это не идеальный подход, но он до сих пор работает. Мне все равно интересно услышать какие-либо другие предложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top