jednostkowe testy EJB z Maven 2 i Glassfish 3

Próbowałem skonfigurować moją aplikację tak, że mogę testować jednostkę to EJBs cały dzień, ale nie mogę przejść przez to, co wydaje się być naprawdę prostym problemem.

Mam standardową aplikację internetową Maven ustawioną w NetBeans 6.9. Automatycznie wygenerowałem test jednostkowy dla jednego z EJB, ale za każdym razem, gdy go uruchamiam, pojawia się komunikat o błędzie:

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)

Zbadałem ten jeden do śmierci i jestem prawie pewien, że problem polega na tym, że mój pom wskazuje obecnie na słoik, który zawiera tylko API

<dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

Not i implementacji, które mogą być wykorzystane do uruchomienia testów. Jestem prawie pewien, że test zawodzi w metodzie oznaczonej @BeforeClass, gdy próbuje wykonać

container = EJBContainer.createEJBContainer();

Standardowym zalecanym rozwiązaniem jest dodanie artefaktu glassfish-embedded-all jako pierwszej zależności projektu z zakresem testowym

<dependency>
            <groupId>org.glassfish.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>

Mogę znaleźć Pakiet Maven dla tego artefaktu tutaj: http://download.java.net/maven/glassfish / ale Nexus nie rozpoznaje tego katalog lub którykolwiek z podkatalogów jako repozytoria Maven 2. Przypuszczam, że mógłbym pobrać jar i ręcznie zainstalować go w Nexus, ale to wydaje się pokonać punkt who instalacji Nexus.

Czy jest jakieś repozytorium Mavena, które Nexus będzie mógł zindeksować, by dać mi artefakt osadzony w glassfish? Kilka postów, które przeczytałem, wspominało, że prawidłowym artefaktem, którego teraz używam, jest javax.ejb ale nie mam więcej szczęścia w znalezieniu tego.

Jak pewnie się domyślasz jestem zupełnie nowy w testach jednostkowych i całkiem nowy w JEE6 w ogóle; czy jest to w ogóle właściwy sposób na testowanie jednostkowe EJB?

Author: wobblycogs, 2010-08-05

1 answers

(...) Standardowym zalecanym rozwiązaniem jest dodanie artefaktu glassfish-embedded-all jako pierwszej zależności projektu z test scope

Rzeczywiście, potrzebujesz implementacji, takiej jak glassfish-embedded-all lub glassfish-embedded-web, Jeśli używasz tylko profilu sieciowego, co wydaje się być twoim przypadkiem(nie wiedziałem, że profil sieciowy dostarczał EJBContainer przy okazji).

I aby być precyzyjnym, ten artefakt nie musi być "pierwszą" zależnością, ale musi być zadeklarowana przed artefakt.

Czy jest jakieś repozytorium Mavena, które Nexus będzie mógł zindeksować, by dać mi artefakt osadzony w glassfish?

Nie mogłem odtworzyć problemu z http://download.java.net/maven/glassfish / ale wygląda na to, że repozytorium JBoss Nexus go ma (prawdopodobnie dlatego, że używają go w Arquillian):

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Maven Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public</url>
</repository>

Czy to w ogóle poprawny sposób na testowanie EJB?

Testy jednostkowe to zazwyczaj robi się to poza kontenerem i w izolacji (używając szyderczego frameworka), więc nie nazwałbym tego testowaniem jednostkowym. Ale dla integracji/testowania funkcjonalnego (w kontenerze), API EJBContainer jest naprawdę świetne i doskonale.

Zobacz też

 13
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-29 14:48:24