testes unitários EJBs com Maven 2 e Glassfish 3

Eu tenho tentado definir meu aplicativo para que eu possa testar a unidade é EJBs durante todo o dia, mas eu não consigo passar o que parece ser um problema muito simples.

Eu tenho um aplicativo web Maven padrão configurado no NetBeans 6.9. Eu gerou automaticamente um teste de unidade para um dos EJBs, mas sempre que vou executá-lo, recebo a mensagem de erro:

Testcase: initializationError(com.example.ExampleTest): Caused an ERROR Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 

Eu pesquisei este até a morte e tenho certeza que o problema é que o meu pom atualmente aponta para um flask que contém apenas a API

  javax javaee-web-api 6.0 provided  

Não e implementação que pode ser usada para executar os testes. Tenho certeza que o teste está falhando no método marcado com @BeforeClass quando ele tenta executar

 container = EJBContainer.createEJBContainer(); 

A solução padrão recomendada é adicionar o artefato glassfish-embedded-all como a primeira dependência do projeto com o escopo do teste

  org.glassfish.extras glassfish-embedded-all 3.0.1 test  

Eu posso encontrar um pacote Maven para este artefato aqui: http://download.java.net/maven/glassfish/ mas o Nexus não reconhece este diretório ou qualquer um dos subdiretórios como repositorys do Maven 2. Eu suponho que eu poderia baixar o jar e instalá-lo manualmente no Nexus, mas isso parece derrotar o ponto de instalação do Nexus.

Então, existe um repository Maven que o Nexus poderá indexar para me fornecer o artefato glassfish-embedded-all? Alguns posts que li mencionaram que o artefato correto a ser usado agora é javax.ejb, mas não tive mais sorte em encontrar isso.

Como você provavelmente já adivinhou que sou completamente novo no teste de unidade e relativamente novo no JEE6 em geral; isso é mesmo a maneira correta de ir sobre EJBs de teste de unidade?

(…) A solução padrão recomendada é adicionar o artefato de glassfish-embedded-all como a primeira dependência do projeto com o escopo do teste

Na verdade, você precisa de uma implementação como glassfish-embedded-all ou glassfish-embedded-web se você estiver usando apenas o perfil da web, o que parece ser o seu caso (eu não sabia que o perfil da web estava fornecendo EJBContainer pelo caminho ).

E, para ser preciso, esse artefato não precisa ser a “primeira” dependência, mas deve ser declarado antes do artefato javaee-api .

Então, existe um repository Maven que o Nexus poderá indexar para me fornecer o artefato glassfish-embedded-all?

Não consegui reproduzir o problema com http://download.java.net/maven/glassfish/, mas parece que o repository do JBoss Nexus o possui (provavelmente porque eles o usam no Arquillian ):

  jboss-public-repository-group JBoss Public Maven Repository Group https://repository.jboss.org/nexus/content/groups/public  

isso é mesmo a maneira correta de ir sobre EJBs de teste de unidade?

Os testes unitários são normalmente feitos fora do container e isoladamente (usando um framework Mocking), então eu não chamaria esse teste unitário. Mas para integração / teste funcional (no container), a API EJBContainer é realmente ótima e perfeitamente bem.

Veja também

  • TOTD # 128: EJBContainer.createEJBContainer: EJB incorporado usando o GlassFish v3
  • Testes Unitários EJBs e JPA com GlassFish Embeddable
  • Usando a API EJBContainer com ou sem o Maven (mas com o GlassFish v3)
  • Incorporando o Contêiner EJB 3.1 em seus testes de unidade – Tempo de boot: 5 segundos
  • Testes Unitários EJB 3.1 … Quando 0.8 segundos são muito longos para um exemplo de teste de unidade
  • O projeto Arquillian