¿Dónde puedo encontrar un ejemplo completo de complemento de Maven Cargo para las pruebas EJB?

Para las pruebas de algunas pequeñas aplicaciones empresariales de JBoss, me gustaría usar JUnit, yPlugin Maven Cargo. (Sé que también hay JSFUnit, pero primero me gustaría echar un vistazo más de cerca a Cargo).

¿Hay un ejemplo sencillo disponible en línea que pueda usar como referencia para ejecutar una prueba JUnit que invoque una operación EJB utilizando JBoss (4.2 o 5.1) utilizando el complemento Maven Cargo? He encontrado algunas buenas introducciones a la configuración, pero recibo mensajes de error en la búsqueda de EJB, por lo que sería útil ver cómo se debe usar.

Aquí está el código de prueba usando InitialContext:

public void testEcho() {
   assertEquals("Echo Echo", lookupEchoBeanRemote().Echo("Echo"));
}

private EchoBeanRemote lookupEchoBeanRemote() {
    try {
        Context c = new InitialContext();
        return (EchoBeanRemote) c.lookup("EchoBean/remote");
    } catch (NamingException ne) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
        throw new RuntimeException(ne);
    }
}

Lo que da este error:

testEcho(de.betabeans.Echo2Test)  Time elapsed: 0.885 sec  <<< ERROR!
java.lang.reflect.UndeclaredThrowableException
    at $Proxy3.Echo(Unknown Source)
    at de.betabeans.Echo2Test.testEcho(Echo2Test.java:17)
Caused by: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
    at java.security.AccessController.doPrivileged(Native Method)
    at org.jboss.ejb3.security.client.SecurityActions.createSecurityContext(SecurityActions.java:657)
    at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:59)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
    at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)
    at $Proxy4.invoke(Unknown Source)
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)
    ... 28 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.jboss.security.SecurityContextFactory.createSecurityContext(SecurityContextFactory.java:117)
    at org.jboss.security.SecurityContextFactory.createSecurityContext(SecurityContextFactory.java:76)
    at org.jboss.ejb3.security.client.SecurityActions$1.run(SecurityActions.java:662)
    ... 38 more
Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/security/jacc/PolicyContextException
    at java.lang.ClassLoader.defineClass1(Native Method)

Si utilizo la anotación EJB

@EJB(beanInterface=EchoBeanRemote.class,mappedName="EchoBean/remote")
private EchoBeanRemote newSessionBean;

public Echo3Test(String testName) {
    super(testName);
}

public void testEcho() {
   assertEquals("Echo Echo", newSessionBean.Echo("Echo"));
}

El resultado de la prueba es

testEcho(de.betabeans.Echo3Test)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.NullPointerException
    at de.betabeans.Echo3Test.testEcho(Echo3Test.java:20)

jndi.properties se encuentra en la carpeta raíz de jar de EJB y contiene estas líneas:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099
### The TimedSocketFactory connection timeout in milliseconds (0 == blocking) 
jnp.timeout=0
### The TimedSocketFactory read timeout in milliseconds (0 == blocking) 
jnp.sotimeout=0

El código fuente del bean es

package de.betabeans;

import javax.ejb.Remote;

@Remote
public interface EchoBeanRemote {
    String Echo(final String in);
}
package de.betabeans;

import javax.ejb.Stateless;

@Stateless
public class EchoBean implements EchoBeanRemote {
    public String Echo(final String in) {
        return in + " " + in;
    }
}

También he probado una aplicación web que puede llamar al EJB sin problemas, en ambos sentidos, con InitialContext o una anotación. Una advertencia que recibí en el despliegue de la aplicación web fue

WARN [MappedReferenceMetaDataResolverDeployer] Las referencias no resueltas existen en JBossWebMetaData: [# web-app: AnnotatedEJBReferenceMetaData {name = de.betabeans.Echo3Servlet / echoBean, ejb-ref-type = null, link = null, un par de artículos de información en el caso de la información y el establecimiento de este establecimiento. name = EchoBean / remote, resolvió-jndi-name = null, beanInterface = interface de.betabeans.EchoBeanRemote}, # web-app: AnnotatedEJBReferenceMetaData {name = NewServlet / newSessionBean, ejb-ref-type = null, link = null, ignore -dependecy = falso, mapeado / jndi-name = NewSessionBean / remote, resolver-jndi-name = null, beanInterface = interface de.betabeans.NewSessionBeanRemote}] 12: 26: 11,770 INFO

Todas las pruebas realizadas con JBoss 5.1.0.GA en dos sistemas de compilación diferentes.

He subido el proyecto completo de Maven ahora ahttp://www.mikejustin.com/download/JBossSimpleEJBApp-ejb-test.zip

Respuestas a la pregunta(1)

Su respuesta a la pregunta