que j2ee java unit-testing maven-2 java-ee junit

j2ee - Pruebas contra la API de Java EE 6



java ee documentation (3)

En cuanto a mí, la implementación de JBoss es más pequeña que todo Glassfish, así que estoy usando:

<dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>${version.jboss-javaee-6.0}</version> <type>pom</type> </dependency>

<scope>test</scope> tampoco debería causar daños.

Escribo una adición a JAX-RS e incluí la API de Java EE 6 como una dependencia de Maven.

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

Entonces tengo un pequeño caso de prueba:

@Test public void testIsWriteable() { class SpecialViewable extends Viewable { public SpecialViewable() { super("test"); } } FreeMarkerViewProcessor processor = new FreeMarkerViewProcessor(null); assertTrue(processor.isWriteable(SpecialViewable.class, null, null, MediaType.WILDCARD_TYPE)); }

Pero me sale un error:

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/core/MediaType ...

Si incluyo Jersey como una implementación de JAX-RS en lugar de la API de Java EE todo está bien.

Gracias a la sugerencia de BalusC sé lo que había adivinado: Java EE 6 es solo una API sin cuerpos de métodos: del blog java.net

Puede compilar su código con este jar pero, por supuesto, no puede ejecutar su aplicación con él, ya que contiene solo las API de Java EE 5 y no contiene ningún cuerpo de método. Si intentas ejecutar, obtendrías esta excepción:

Excepción en el hilo "principal" java.lang.ClassFormatError: atributo de código ausente en el método que no es nativo o abstracto en el archivo de clase javax / mail / Session

Para ejecutar una aplicación Java EE 5, aún necesitará un contenedor Java EE 5, como por ejemplo el servidor de aplicaciones GlassFish.

Intenté agregar a Jersy con el alcance de la test pero no funcionó.

<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey-version}</version> <scope>test</scope> </dependency>

¿Cómo puedo probar el software que solo depende de la API oficial de Java EE?

Solución

El proveedor (Jersey) debe colocarse antes de la API (javeee-api) en el pom.xml.

<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey-version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency>


No estoy seguro de que esto resuelva su problema, pero GlassFish Embedded proporciona una implementación de Java EE 6. Agregue esto a su pom.xml :

<project> ... <repositories> <repository> <id>glassfish-extras-repository</id> <url>http://download.java.net/maven/glassfish/org/glassfish/extras</url> </repository> </repositories> ... <dependencies> <dependency> <groupId>org.glassfish.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>3.0.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> ... </dependencies> ... </project>

Es importante declarar el artefacto glassfish-embedded-all antes del javaee-api .


Una alternativa que es independiente del proveedor de JSR es

<dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency>

Esto le permite cambiar a Jersey con un proveedor diferente. Para Glassfish 3.1.2, utiliza jersey-server 1.11 , que usa jsr311 versión 1.1 de acuerdo con jersey pom.