Pergunta

Eu tenho algum código (Scala) no Play que usa JPA para acesso ao banco de dados.Funciona bem.Mas quero testar a unidade do meu código, o que exigirá o uso de um EntityManager simulado.Isso é possível?

Meu teste é escrito em specs2 (estendendo PlaySpecification) e é executado com JUnit.Estou usando o Mockito para zombar do EntityManager.Mas eu esperaria poder fazer isso com outras estruturas.

Esta é a aparência do meu 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
    }
}

Se não for possível testar a unidade deste código, existe alguma abordagem alternativa para acesso a dados que seja recomendada?

Foi útil?

Solução

Aparentemente não há como usar um EntityManager simulado aqui, pelo menos nenhum que eu possa encontrar.Então tive que revisar meu design.

Will Sargent, da Typesafe, sugeriu a criação de um subprojeto de persistência de banco de dados separado na lista de discussão: https://groups.google.com/d/msg/play-framework/1u-_JbTIuQg/L5_9o4YCfoMJ.Não fui tão longe, mas encontrei uma solução que funcionou para mim, definindo uma interface DAO separada.

Coloquei todo o código JPA em uma característica DAO - toda a implementação está lá.Há também um objeto complementar para fornecer uma instância singleton.Igual a:

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

Agora mudo meus controladores para características, com uma referência ao DAO deixada sem definição.Um objeto complementar define a instância DAO para o objeto singleton.Isso evita fazer alterações no arquivo de rotas (não há necessidade de instanciar os controladores).Igual a:

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

Portanto, tudo funciona facilmente com o código JPA padrão quando o aplicativo está em execução.Mas quando eu quiser fazer um teste de unidade, posso inserir um DAO simulado assim (isso está usando o Mockito):

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

Talvez esta não seja a abordagem ideal, mas tem funcionado até agora.Eu ainda estaria interessado em ouvir outras sugestões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top