2009-11-10 3 views
2

Для тестирования некоторых небольших приложений 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

+0

Есть много образцов Карго + 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 и ошибку здесь, чтобы мы могли помочь. В чем проблема на самом деле? –

+0

Я получаю это исключение: javax.naming.NoInitialContextException: Невозможно создать экземпляр класса: org.jnp.interfaces.NamingContextFactory [Исключение корня java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] – mjn

+0

Это можно устранить, добавив jbossall- клиент.jar для POM, но я запускаю исключение класса, если я использую метод контекстного поиска. У меня нет файла конфигурации jboss.xml и теперь попробуйте настроить EJB. Если я использую аннотацию @EJB, я получаю исключение с нулевым указателем. – mjn

ответ

5

EDIT: после того, как добавили источники

Прежде всего - мой пример работает на JBoss 4.2.3.GA и грузов 1,0 Я сделал некоторые рефакторинг вашего кода:

pom.XML-файл

<groupId>de.betabeans</groupId> 
    <artifactId>JBossSimpleEJBApp-ejb-test</artifactId> 
    <packaging>ejb</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>JBossSimpleEJBApp-ejb JEE5 EJB Test</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
     <dependency> 
       <groupId>javax.ejb</groupId> 
       <artifactId>ejb-api</artifactId> 
       <version>3.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>jboss</groupId> 
      <artifactId>jboss-ejb3</artifactId> 
      <version>4.2.3.GA</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.jboss.client</groupId> 
      <artifactId>jbossall-client</artifactId> 
      <version>4.2.3.GA</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <repositories> 
      <repository> 
       <releases> 
        <enabled>true</enabled> 
       </releases> 
       <snapshots> 
        <enabled>true</enabled> 
        <updatePolicy>always</updatePolicy> 
       </snapshots> 
       <id>repository.jboss.com</id> 
       <name>Jboss Repository for Maven</name> 
       <url>http://repository.jboss.com/maven2/</url> 
       <layout>default</layout> 
      </repository> 
    </repositories> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.0.2</version> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ejb-plugin</artifactId> 
       <version>2.1</version> 
       <configuration> 
        <ejbVersion>3.0</ejbVersion> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.cargo</groupId> 
       <artifactId>cargo-maven2-plugin</artifactId> 
       <version>1.0</version> 
       <configuration> 
        <container> 
         <containerId>jboss42x</containerId> 
         <home>${jboss.home}</home> 
         <append>false</append> 
        </container> 
        <configuration> 
         <type>existing</type> 
         <home>${jboss.home}/server/default</home> 
         <properties> 
          <cargo.jboss.configuration>default</cargo.jboss.configuration> 
          <cargo.rmi.port>1099</cargo.rmi.port> 
          <cargo.logging>high</cargo.logging> 
         </properties> 
        </configuration> 
        <wait>false</wait> 
       </configuration> 
       <executions> 
        <execution> 
         <id>start-container</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>start</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>stop-container</id> 
         <phase>post-integration-test</phase> 
         <goals> 
          <goal>stop</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <skip>true</skip> 
       </configuration> 
       <executions> 
        <execution> 
         <id>surefire-it</id> 
         <phase>integration-test</phase> 
         <goals> 
          <goal>test</goal> 
         </goals> 
         <configuration> 
          <skip>false</skip> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
     <finalName>JBossSimpleEJBApp-ejb-test</finalName> 
    </build> 

Я изменил свой POM в следующих разделах:

  • dependecies (использовать EJB-апи из glasfish)
  • репозиториев (я рекомендую использовать JBoss Maven2 в макет по умолчанию версия)
  • и containerId груза-Maven2-плагин

Я переместил папку ресурсов, чтобы проверить папку,

jndi.properties файл должен быть использование теста (не бобами) и может быть следующим или что у вас есть:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
java.naming.provider.url=localhost 

В orher конфигурации файлы (jboss.xml, MANIFEST.MF) не нужны.

Конфигурация сервера
Самая большая проблема с JBoss 4.2.3.GA сервера и ejb.jar файла является то, что он не работает по умолчанию! Описание проблемы и обходной путь вы найдете here. (Это было самым трудным. В сервере JBoss 5.0 эта проблема не существует, но в мавена-Карго-плагин этого контейнера как экспериментальный)

Это все
Ниже я вставляю некоторые ссылки на ссылки, если у вас все еще проблемы, я пошлю вам весь мой фиксированный проект.


Мой первоначальный ответ
Есть несколько проблем, с грузом и JBoss. Основная причина заключается в том, что конфигурация datasource в pom не работает, поэтому вам нужно развернуть отдельный файл источника данных. С точки зрения JBoss это должен быть файл, размещенный в главном каталоге развертывания (для Tomcat находится в папке META-INF). Вторая задача - копировать библиотеку jdbc перед запуском груза.

Отличный ресурс для вас - это сообщение от Carlos Sanchez blog. Может быть, вы можете использовать Selenium вместо JSFUnit тоже :)

Чтобы скопировать файл источника данных я использую следующую конфигурацию:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-resources-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-ds-context</id> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <phase>pre-integration-test</phase> 
        <configuration> 
         <outputDirectory>${jboss.deploy-ds.dir}</outputDirectory> 
         <resources> 
          <resource> 
           <directory>${basedir}/src/main/webresources/META-INF</directory> 
           <filtering>true</filtering> 
           <includes> 
            <include>context-ds.xml</include> 
           </includes> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Большое спасибо за ваш ответ, который может быть полезен в будущем - в моем нынешнем очень базовом примере проекта нет источников данных. – mjn

+0

Отлично работает - ваша помощь очень ценится! – mjn

 Смежные вопросы

  • Нет связанных вопросов^_^