在哪里可以找到用于 EJB 测试的完整 Maven Cargo 插件示例?

2024-04-23

对于一些小型 JBoss 企业应用程序的测试,我想使用 JUnit,并且Maven 货物插件 http://cargo.codehaus.org/Maven2+plugin。 (我知道还有 JSFUnit,但首先我想仔细看看 Cargo。)

网上是否有一个简单的示例,我可以将其用作运行 JUnit 测试的参考,该测试使用 Maven Cargo 插件使用 JBoss(4.2 或 5.1)调用 EJB 操作?我找到了一些很好的配置介绍,但我在 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 jar 根文件夹中,包含以下行:

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;
    }
}

我还测试了一个 Web 应用程序,它可以毫无问题地调用 EJB - 使用 InitialContext 或注释两种方式。我在部署 Web 应用程序时收到的警告是

警告 [MappedReferenceMetaDataResolverDeployer] JBossWebMetaData 中存在未解析的引用:[#web-app:AnnotatedEJBReferenceMetaData{name=de.betabeans.Echo3Servlet/echoBean,ejb-ref-type=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 信息

所有测试均使用 JBoss 5.1.0.GA 在两个不同的构建系统上执行。

我现在已经将完整的 Maven 项目上传到http://www.mikejustin.com/download/JBossSimpleEJBApp-ejb-test.zip http://www.mikejustin.com/download/JBossSimpleEJBApp-ejb-test.zip


编辑:添加来源后

首先 - 我的示例适用于 JBoss 4.2.3.GA 和 Cargo 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:

  • 依赖项(您使用 glasfish 中的 ejb-api)
  • 存储库(我建议在默认布局中使用 JBoss Maven2)
  • Cargo-maven2-plugin 的版本和containerId

我已将资源文件夹移至测试文件夹

jndi.属性文件必须由测试(而不是 bean)使用,并且可以如下所示或您拥有:

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

不需要其他配置文件(jboss.xml、MANIFEST.MF)。

服务器配置
jboss 4.2.3.GA 服务器和 ejb.jar 文件的最大问题是它默认不工作!您可以找到的问题描述和解决方法here https://jira.jboss.org/jira/browse/JBPORTAL-1855。 (这是最难的事情。在 Jboss 5.0 服务器中,这个问题不存在,但在 maven-cargo-plugin 中,这个容器是实验性的)

就这样
下面我粘贴了一些参考链接,如果您仍然遇到问题,我会将我的整个修复项目发送给您。

  • EJB 3.0 Jboss教程(源代码) http://www.jboss.org/ejb3/docs/
  • Jboss 4.2.x 配置 http://cargo.codehaus.org/JBoss+4.2.x

My original answer
There are several problems with Cargo and JBoss. Main reason is that datasource configuration in pom doesn't work, so you need to deploy separate datasource file. From JBoss perspective it has to be a file placed in main deploy directory (for Tomcat is located in META-INF folder). Second task is copy jdbc library before cargo run.

这篇文章对您来说是很好的资源卡洛斯·桑切斯博客 http://www.jroller.com/carlossg/entry/functional_testing_with_maven_cargo。也许你也可以使用 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里可以找到用于 EJB 测试的完整 Maven Cargo 插件示例? 的相关文章

  • 如何让 Jenkins 在 Maven 2 构建上 --fail-fast?

    我正在尝试使用 Jenkins 构建一个多模块 Maven 项目 当我在命令行使用相同的环境 variables settings xml user 正如 Jenkins 所做的那样 测试失败会导致构建立即失败 Failed tests t
  • 无法使用 junit 测试异常

    我有一个包含 try catch 块的方法 但我不知道如何使我的测试通过 这是我的代码 public class ClassToTest public void loadFileContent try InputStream fileStr
  • Glassfish 和 JBoss 5 的现实比较?

    在现实世界中有人有这两种经历吗 它们在性能 内存使用 速度等 方面如何比较 稳定 JBoss Seam 在 Glassfish 上运行良好吗 从我自己的经历来看 有几点 GlassFish 拥有更好的管理控制台 JBoss 有三个控制台 每
  • 在哪里可以找到用于 EJB 测试的完整 Maven Cargo 插件示例?

    对于一些小型 JBoss 企业应用程序的测试 我想使用 JUnit 并且Maven 货物插件 http cargo codehaus org Maven2 plugin 我知道还有 JSFUnit 但首先我想仔细看看 Cargo 网上是否有
  • 查找多模块 Maven Reactor 项目的根目录

    有没有一种简单的方法可以找到多模块 Maven 项目的根 例如 Gradle 的rootDir 背景 我想使用 maven dependency plugin 将多模块项目的所有子模块中的工件复制到相对于整个项目的根目录的目录 也就是说 我
  • 单元测试应该默认使用“抛出异常”吗?

    换句话说 我应该附加throws Exception我的所有或大部分单元测试 当您使用 Android Studio 生成单元测试 命令 N gt 测试方法 时 它默认添加抛出异常 前任 Test public void someMetho
  • Maven:我应该保留还是删除声明的依赖项,这些依赖项也是传递依赖项?

    您认为删除 Maven pom 中可以找到的所有传递依赖项是一个好习惯吗 Example 我的项目依赖于A和B B 也是 A 的传递依赖 我应该将 B 保留在我的 pom 中还是将其删除 哪个最好 拥有所有已知的 jar 甚至是传递性的 j
  • Maven编译失败(但Eclipse下编译成功)

    在构建我的网络项目时Eclipse 一切安好 没有错误 没有警告 然而 在构建项目时Maven it failes 下面是输出形式mvn compile c Users jwa Desktop tets traffic web gt mvn
  • 由于 poms 中的版本发生更改,合并来自 Maven 发布分支的更改会产生冲突

    按照标准实践 我有一个用于功能开发的 svn 主干 以及一个用于构建版本的分叉分支 该分支是使用 maven 发布插件创建的 该插件也用于创建发布 碰巧的是 偶尔的错误将在分支上修复 并且这些更改需要合并回主干 为了不错过任何更改 我希望能
  • Maven + Surefire/Failsafe - forkMode="perthread" 不起作用...解决方法?

    我们正在开发一个基于嵌入式 Infinispan 数据网格集群的应用程序 在我们应用程序的目标环境中 数据网格的每个成员将在独立的 JVM 中运行并使用jgroup集群将会形成 这实际上是由 Infinispan 完成的 为了对我们正在使用
  • 在 Servlet 2.4 容器上运行 JSF 2.0

    据我所知 JSF 2 需要 servlet 2 5 因此它不能在 JBOSS 4 05 Tomcat 5 5 上运行 不幸的是 我必须在该环境中部署一个使用 JSF 2 0 和 Primefaces 的应用程序 有什么黑客可以使用它吗 JS
  • jUnit 中的 CollectionAssert?

    是否有与 NUnit 并行的 jUnit 使用 JUnit 4 4 您可以使用assertThat 与Hamcrest http hamcrest org JavaHamcrest 代码 不用担心 它是随 JUnit 一起提供的 不需要额外
  • Hibernate 验证器:违规消息语言

    我有一个测试类 我正在测试一个域模型 该模型用例如注释 NotNull 在我的测试课中 我首先得到验证器 private static Validator validator BeforeClass public static void s
  • 多模块 Web 项目中的 Maven:如何将同级模块输出放入 WEB-INF/classes,而不是作为 JAR 放入 WEB-INF/lib?

    我有一个多模块 Maven 项目 默认情况下 当我构建 Web 模块时 它所依赖的所有 JAR 类型的同级模块都会复制到 WEB INF lib 文件夹中 我希望将同级模块的输出放置在 WEB INF classes 文件夹中 而不打包到
  • 使用 Maven 仅下载 JAR

    我想让 Maven 下载 pom xml 文件中列出的 JAR 我怎么做 目前 Maven 想要编译该项目 但失败了 我不关心编译它 因为我是手动编译的 我只想要罐子 帮助 Albert ps 背景 我手动编译它是因为我可以轻松地在Ecli
  • 如何使用 Maven 创建新的 Eclipse RCP 项目?

    如何使用 Maven 创建新的 Eclipse RCP 项目 最好是m2eclipse http maven apache org eclipse plugin html 我读到有一个关于 Eclipse 的 Maven 插件 Maven
  • JUnit、测试和线程

    当我连续运行多个 JUnit 测试时 JUnit 是否为每次执行创建一个新线程 或者所有内容都包装在一个线程中 Thanks 这一切都在一个线程上 您没有说明如何调用测试 但例如 运行 TestSuite 将按顺序运行套件中的所有测试 如果
  • 验证在子类上调用此方法时是否调用了重写的超类方法

    我将用这个例子来展示我的问题 我有一个带有方法的类foo 该类有一个重写此方法的子类 子类的方法调用超类的方法 我可以验证一下吗 我不想测试什么foo在超类中确实如此 我只需要验证它是否被调用 我知道重构可以有所帮助 优先考虑组合而不是继承
  • 使用 Gmail 帐户在 JBoss 中配置 mail-service.xml

    我想配置我的 mail service xml 以从我的 Gmail 帐户发送电子邮件 我已经做了配置 但是没有用
  • Eclipse(STS)+ Maven

    我基本上有两个问题 有没有办法从 Eclipse 调用 Maven 控制台 我可以在哪里写eclipse eclipse 并开始构建 eclipse 项目 哪里有STS http www springsource com products

随机推荐