Como fazer o teste de unidade EJBS ao usar o JPA2?
-
26-09-2019 - |
Pergunta
Como você iria testar uma unidade de um EJB que usa o JPA? Por exemplo, se eu tiver uma entidade de ordem e e Orderejb que deveria calcular o total de um pedido (conforme definido abaixo), como eu testaria o EJB sem tocar no banco de dados? Além disso, como você definiria valores para suas entidades, para poder afirmar o cálculo esperado? Aqui está algum código de exemplo abaixo ...
@Entity
public class Order {
@Id
private long OrderId;
private LineItem[] items;
}
E um orderejb
@Stateless
public class OrderEJB {
EntityManager em;
public double calculateOrderTotal(long orderId) { .. }
}
Como você iria testar o método CalcularOrderTotal se eu não conseguir tocar no banco de dados? Não quero implementar um DAO porque estou tentando me afastar dessa abordagem.
Obrigado por qualquer ajuda.
Solução
A teoria geral de que Orderejb e Order e LineItem não são (se ignorarmos a anotação), apenas Pojo e, portanto, podem ser testados no Junit independente? Precisaremos zombar da entidade -manáger e presumivelmente em
calculateOrderTotal()
você tem algum código que no conceito vai
em.giveMeThisOrder(orderId)
E você apenas zomba disso. A lógica das empresas que você está testando é motivada pelo que a simulação retorna. A chave para isso é que você deve usar uma boa estrutura de zombaria, por exemplo, Jmock. Em qualquer teste, você diz (obviamente não com esta sintaxe):
EntitiyManager mockEm = // create the mock
mockEm.check(that you are called with and order Id of 73)
mockEm.please( when someone calls giveMeThisOrder return then **this** particular order)
E assim, em cada teste, você cria exatamente o pedido necessário para exercer algum aspecto do seu código de calcificação. Você pode muito bem ter muitos testes que pressionam todos os casos de borda e canto do seu cálculo.
A idéia principal aqui é que o teste de unidade não implica dependência externa, como um banco de dados. O teste de integração pode usar um banco de dados real. Pode ser um aborrecimento acertar suas zombadas, criar essas instâncias de pedidos pode ser bastante monótono, mas tende a tornar os testes futuros muito mais rápidos.
Eu também sou a favor de fazer testes antecipados de integração - você encontra uma outra classe de erros dessa maneira.
Outras dicas
Você experimentou o OpenEJB? - Se você configurar no modo incorporado, poderá executar testes de unidade a partir do Eclipse. Eu zombei de injeções de gerente de entidades etc. para testes de unidade antes, mas depois fica tedioso. Com o OpenEJB, você pode fazer isso com menos configuração. http://openejb.apache.org/
Aqui está o que eu faço:
Primeiro, você precisa configurar um banco de dados de memória para seus testes. Funciona como um banco de dados regular, mas não é armazenado no disco. Tanto o Derby quanto o HSQLDB suportam isso.
No seu teste de unidade, crie um entityManager manualmente e injete -o na sua instância EJB. Você provavelmente precisará manter uma referência ao EntityManager para que você possa gerenciar as transações, assim:
em.getTransaction().begin();
myEjb.doSomething(x, y);
em.getTransaction().commit();