Pregunta

Tengo algún código (SCALA) en juego que utiliza JPA para el acceso de DB.Funciona bien.Pero quiero probar la unidad mi código, lo que requerirá usar un simulacro de entidades.¿Esto es posible?

Mi prueba está escrita en especificaciones2 (extendiendo la experiencia de reproducción) y se ejecuta con JUnit.Estoy usando Mockito para burlarse de la EntityManager.Pero esperaría poder hacer esto con otros marcos.

Aquí es cómo se ve mi código:

object MyThing {
    def create(...) : MyThing = {
        val newThing = ...
        JPA.withTransaction(new play.libs.F.Function0[Unit]() {
            def apply() = {
                JPA.em().persist(newThing)
            }
        })
        return newThing
    }
}

Si no es posible probar este código, ¿existe algún enfoque alternativo para el acceso de datos que se recomienda?

¿Fue útil?

Solución

Aparentemente, no hay manera de usar un burdemanager simulado aquí, al menos ninguno que pueda encontrar. Así que tuve que revisar mi diseño.

Sargent of Typesfe sugirió crear un subproyecto de persistencia de DB separado en la lista de correo: https://groups.google.com/d/msg/play-framework/1u-_jbtiuqg/l5_9o4ycfomj . No he ido bastante lejos, pero encontré una solución que me funcionó definiendo una interfaz DAO separada.

Puse todo el código JPA en un rasgo de DAO: toda la implementación está allí. También hay un objeto Companion para proporcionar una instancia de Singleton. Me gusta así:

trait MyThingDAO {
    def create(...) : MyThing = { ... }
}
object MyThingDAO extends MyThingDAO

Ahora cambio mis controladores a los rasgos, con una referencia al DAO dejado sin tomar. Un objeto Companión establece la instancia de DAO al objeto Singleton. Esto evita realizar cualquier cambio en el archivo de rutas (sin necesidad de instanciar los controladores). Me gusta así:

trait MyThingController {
    val myThingDao : MyThingDAO
    def myAction = Action { implicit request => ... }
}
object MyThingController {
    val myThingDao = MyThingDAO
}

Así que todo funciona lo suficientemente fácilmente con el código JPA estándar cuando se ejecuta la aplicación. Pero cuando quiero una prueba de la unidad, puedo insertar un DAO simulado, así (esto está usando Mockito):

...
val mockDao = mock[MyThingDAO]
val controller = new MyThingController() { val myThingDao = mockDao }
...

Tal vez este no sea el enfoque ideal, pero ha estado trabajando hasta ahora. Todavía estaría interesado en escuchar cualquier otra sugerencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top