Для тестирования некоторых небольших приложений JBoss я хотел бы использовать JUnit и Maven Cargo plugin. (Я знаю, что есть также JSFUnit, но сначала я хотел бы взглянуть на Cargo.)Где я могу найти полный пример плагина Maven Cargo для тестов EJB?
Есть ли простой пример, доступный в Интернете, который я мог бы использовать в качестве ссылки для запуска теста JUnit, который вызывает операцию EJB используя JBoss (4.2 или 5.1), используя плагин Maven Cargo? Я нашел несколько хороших дополнений к конфигурации, но получаю сообщения об ошибках в EJB-поиске, поэтому было бы полезно посмотреть, как его использовать.
Вот тестовый код с помощью 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);
}
}
Что дает эту ошибку:
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)
Если я использую 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"));
}
Результат теста
testEcho(de.betabeans.Echo3Test) Time elapsed: 0.001 sec <<< ERROR!
java.lang.NullPointerException
at de.betabeans.Echo3Test.testEcho(Echo3Test.java:20)
jndi.properties находится в корневой папке EJB баночки и содержит следующие строки:
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
Источника боба-код
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;
}
}
Я также протестировал веб-приложение, которое может вызывает EJB без проблем - в обоих направлениях, с InitialContext или аннотацией. Предупреждение, которое я получил в развертывании веб-приложения был
WARN [MappedReferenceMetaDataResolverDeployer] существуют неразрешенные ссылки в JBossWebMetaData: [# веб-приложение: AnnotatedEJBReferenceMetaData {имя = de.betabeans.Echo3Servlet/echoBean, EJB-реф-типа = null, link = null, ignore-dependecy = false, mapped/jndi-name = EchoBean/remote, resolved-jndi-name = null, beanInterface = interface de.betabeans.EchoBeanRemote}, # web-app: AnnotatedEJBReferenceMetaData {name = NewServlet/newSessionBean, ejb-ref-type = null, link = null, ignore-dependecy = false, mapped/jndi-name = NewSessionBean/remote, resolved-jndi-name = null, beanInterface = interface de.betabeans.NewSessionBeanRemote}] 12: 26: 11,770 INFO
Все испытания, выполненные с JBoss 5.1.0.GA на двух разных систем создания.
Я загрузил полный проект Maven теперь http://www.mikejustin.com/download/JBossSimpleEJBApp-ejb-test.zip
Есть много образцов Карго + JBoss в Интернете, например, http://i-proving.ca/space/Technologies/Maven/Maven+Recipes/Deploy+to+JBoss+using+Cargo или http://www.vineetmanohar.com/2009/05/26/maven-cargo- JBoss /. Но есть много способов использовать Cargo слишком, поэтому, возможно, вы должны вставить свой pom и ошибку здесь, чтобы мы могли помочь. В чем проблема на самом деле? –
Я получаю это исключение: javax.naming.NoInitialContextException: Невозможно создать экземпляр класса: org.jnp.interfaces.NamingContextFactory [Исключение корня java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] – mjn
Это можно устранить, добавив jbossall- клиент.jar для POM, но я запускаю исключение класса, если я использую метод контекстного поиска. У меня нет файла конфигурации jboss.xml и теперь попробуйте настроить EJB. Если я использую аннотацию @EJB, я получаю исключение с нулевым указателем. – mjn