Question

J'ai du code (scala) en jeu qui utilise JPA pour l'accès à la base de données.Fonctionne bien.Mais je veux appuyer sur mon code, ce qui nécessitera d'utiliser un moqueur d'entitéManager.Est-ce possible?

Mon test est écrit dans SPECS2 (en prolongeant la playspecification) et est exécuté avec JUnit.J'utilise Mockito pour se moquer de l'entitémanager.Mais je m'attendrais à pouvoir faire cela avec d'autres cadres.

Voici ce que mon code ressemble à:

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

S'il n'est pas possible de tester un appareil à tester ce code, il existe une approche alternative de l'accès aux données recommandée?

Était-ce utile?

La solution

Apparemment, il n'ya aucun moyen d'utiliser un moqueur d'entitémanager ici, au moins aucun que je pouvais trouver. J'ai donc dû réviser mon design.

SARGENT DE TYPEAFE a suggéré de créer une sous-projet de persistance DB distincte sur la liste de diffusion: https://groups.google.com/d/msg/play-framework/1u-_jbtiuqg/l5_9o4ycfomj . Je ne suis pas allé aussi loin, mais j'ai trouvé une solution qui a fonctionné pour moi en définissant une interface DAO distincte.

Je mets tout le code JPA dans un trait DAO - toute la mise en œuvre est là. Il existe également un objet compagnon pour fournir une instance singleton. Comme:

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

Maintenant, je change mes contrôleurs en traits, avec une référence à la DAO laissée non définie. Un objet compagnon définit l'instance DAO à l'objet Singleton. Cela évite de modifier le fichier de routes (pas besoin d'instancier les contrôleurs). Comme:

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

Donc, tout fonctionne assez facilement avec le code JPA standard lorsque l'application est en cours d'exécution. Mais quand je veux tester un appareil, je peux insérer un simulateur dao comme (ceci utilise Mockito):

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

Peut-être que ce n'est pas l'approche idéale, mais cela fonctionne jusqu'à présent. Je serais toujours intéressé d'entendre toute autre suggestion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top