我正在尝试为我的简单Java EE应用程序设置集成测试,该应用程序使用JAX-RS公开REST服务(它也是EJB)和JPA来存储基础数据,我仍在努力寻找解决方案这不需要手动设置外部容器/应用程序服务器。我已经在这里和网上搜索了大量的搜索解决方案,并且最终燃烧了太多星期才得到GlassFish 3.1.2嵌入式工作,这是我成功做到一周前的最后一根稻草:冲突的文档和错误尝试创建用户以测试安全性。讨厌鬼!我查看了JBoss AS 7,但嵌入式产品看起来不受支持。然后我尝试使用servlet容器(Jetty,Grizzly和Simple)自行编辑以直接运行Jersey。 (我最终计划添加EclipseLink和Derby嵌入式。)所有这些都在设置和运行最基本的JUnit测试时出现了意外和阻塞的挑战;例如,我无法让Jetty运行JAX-RS,而Grizzly没有运行HTTP Basic身份验证。双drat!然后我看了Arquillian,但找不到容器适配器中列出的JBoss AS 7。
我有两个问题:1)这似乎比我预期的要困难得多。如果我认为这不仅仅是我(请,这不仅仅是我!),那么为什么这么难?我想知道整个带有30多个API的Java EE堆栈是否是一个非常难以正确堆叠的卡片之家,并且不适合被塞进一个罐子里。或者也许人们更喜欢在运行测试之前在外部(“本地”?)容器上进行集成测试。
问题2):不同类型的测试容器配置的标准术语是什么?这似乎不一致。例如,http://mvnrepository.com/artifact/org.jboss.arquillian.container列出“远程”,“嵌入”,“托管”和“本地”,但我发现其他地方提到的“容器内”和“容器外”测试。
我没有在上面失败的细节上使用空间,而是准备好倾听这段经历试图告诉我的内容,所以我真的很感激听到对你有用的东西。提前谢谢!
答案 0 :(得分:1)
我每天都遇到完全相同的问题。我的结论是:将业务层与服务接口层分离。即:通过对业务层进行良好设计进行单元测试,并在需要时使用外部工具进行集成测试(例如,jmeter或任何可在已部署系统上进行功能测试的东西)。
大多数时候,我想测试业务逻辑,而不是服务抽象层。我的jax-rs(或其他)处理程序通常只是业务层的包装器。
顺便说一句,我从未使用Arquillian。
我不知道这是否可以被视为答案,只是我的2美分;)
答案 1 :(得分:0)
你想要做的事情听起来就像我现在已经做了一段时间。
我目前正在使用运行JBoss AS 7的Arquillian,因为这是我们在生产中使用的应用服务器。 Arquillian支持托管模式(Arquillian控制启动和停止容器),远程模式(Arquillian不启动或停止服务器但假设它在某处运行)和嵌入模式。并非所有容器适配器都支持嵌入式模式,而且我所理解的Glassfish嵌入式存在其公平的问题。 Apache TomEE提供了一个嵌入式容器,我在各种环境中使用它并且它运行良好。 TomEE适配器的一个好处是它由实际的TomEE团队维护,因此他们可以确保适配器始终与其容器兼容。 TomEE的启动/关闭速度非常快,因此测试基本上与单元测试一样快,差异几乎不可察觉。如果您使用的是Maven,请对嵌入的Apache TomEE使用以下依赖项:
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>arquillian-tomee-embedded</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>
JBoss AS 7在其测试套件中使用Arquillian本身,因此您无需担心Java EE API和实现未针对该容器进行测试。如果您希望构建是自包含的并包含JBoss AS 7实例,则可以使用jboss-as-dist工件。如果您正在使用Maven,您可以使用maven-dependency-plugin解压缩用于测试套件的JBoss AS 7实例:
<build>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>process-test-classes</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-dist</artifactId>
<version>7.1.1.Final</version>
<type>zip</type>
<overWrite>false</overWrite>
<outputDirectory>target</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</build>
(完整示例pom.xml here)
如果您的代码在生产中的应用程序服务器中运行,但您没有进行集成测试,那么您实际上无法确定代码在实际运行时中的行为方式。感谢Arquillian,我已经能够在我最近的项目中编写集成测试,这些测试在应用服务器中执行,测试从JAX-RS端点到http,JPA ORM映射和查询甚至业务逻辑到NoSQL数据库的所有内容。索引引擎。
如果您遇到Arquillian的问题,Arquillian user forums可以提供很大的帮助。希望我的回答可以解释你的问题。