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.

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top