本教程让你熟悉使用 JBoss Forge 的 Arquillian 插件。 阅读本教程后,你能够掌握:
- 安装 Arquillian 插件到 Forge 环境中
- 使用这个插件添加 Arquillian 基础设施到一个基于 Maven 的Java 项目中
- 生成组件和相应的 Arquillian 测试
- 无需手动修改在不同容器中运行 Arquillian 测试
你将完成很多与 快速入门教程 描述中相同的步骤, 不同是这里把一些琐碎的事留给 Forge 来处理。本教程定于快速阅读,就是让你能够更快的入门。
预备知识
本教程假定你已经安装好了 JBoss Forge . 安装 Forge 并不麻烦,请参考 “快速入门教程” 或者 官方的 Forge 文档 ,下载和安装。你的机器上还需要安装 JDK 1.6 或更高版本。
创建项目
在使用 Arquillian之前,我们要先创建一个项目。如果你还没创建,请使用下面的 Forge 命令来创建一个简单的 Java EE 6 项目,包含 JPA 支持。
$ new-project --named arquillian-demo --topLevelPackage demo
? Use [/Users/paul/arquillian-demo] as project directory? [Y/n]
***SUCCESS*** Created project [arquillian-demo] in new working directory [/Users/paul/arquillian-demo]
Wrote /Users/paul/arquillian-demo
Wrote /Users/paul/arquillian-demo/pom.xml
Wrote /Users/paul/arquillian-demo/src/main/java
Wrote /Users/paul/arquillian-demo/src/test/java
Wrote /Users/paul/arquillian-demo/src/main/resources
Wrote /Users/paul/arquillian-demo/src/test/resources
Wrote /Users/paul/arquillian-demo/src/main/resources/META-INF/forge.xml
新项目已经创建,下一步,我们需要添加一些代码用于测试。下面使用 Forge 来创建一个 CDI Bean。
首先,我们使用 “beans” 插件来安装 CDI 到项目中。
$ beans setup
***SUCCESS*** Installed [forge.spec.cdi] successfully. ? Do you want to install CDI APIs? [y/N]
Wrote /Users/paul/arquillian-demo/src/main/resources/META-INF/beans.xml
然后创新建一个 Bean。
$ beans new-bean --type demo.MySimpleBean --scoped DEPENDENT
Picked up type <JavaResource>: demo.MySimpleBean
Wrote /Users/paul/arquillian-demo/src/main/java/demo/MySimpleBean.java
项目已经准备就绪,下面进行测试。
入门
设置 Arquillian 简单,你可能已经 快速入门教程 中读过。在 pom.xml 中配置一个新的 Arquillian 容器需要大量复制和粘贴工作。Forge 可以用一个命令来完成这些工作。
首先你需要安装 Arquillian 插件。
$ forge install-plugin arquillian
现在我们需要设置好 Arquillian 和容器配置。这里使用 JBoss AS7。
$ arquillian setup --container JBOSS_AS_7_MANAGED
Forge 会提示你要使用的 JUnit, Arquillian 和 JBoss AS7 版本。选择使用最新版本。如果你还没下载 JBoss AS7,Forge 甚至也可以帮你自动完成。
就这样,Arquillian 配置完毕。你可以自行查看一下 pom.xml 文件中生成的 dependenices 和 profile,Forge 还在 src/test/resources 创建了一个 arquillian.xml 文件。
编写测试
现在开始写一个测试。再次使用 Forge 帮你完成。
$ arquillian create-test --class demo.MySimpleBean.java
Picked up type <JavaResource>: demo.MySimpleBeanTest
Wrote /Users/paul/arquillian-demo/src/test/java/demo/MySimpleBeanTest.java
一个包含部署和测试方法的新测试类会添加到项目中。它使用 CDI 注入了要测试的类,这样能够立即验证测试是否能够在容器中运行。如果你的 IDE 不能找到 imports,请确认前面创建的 Maven profile 是否已经启用。你可以从 IDE,或者 Maven 命令行,或者 Forge 中直接运行测试。
$ build --profile arq-jbossas-7-managed
恭喜你! 你已经使用 Arquillian 和 Forge 得到第一个 (greenbar) 绿条 !
下面尝试测试 JPA 代码。
测试 JPA
在开始写使用 Java Persistence API (JPA) 的测试之前,需要先配置 JPA。我们将会创建一个 Entity,然后写一个简单的 Data Access Object,这就是我们将要进行测试的类。
$ persistence setup --provider HIBERNATE --container JBOSS_AS7
***SUCCESS*** Installed [forge.spec.jpa] successfully.
***INFO*** Setting transaction-type="JTA"
***INFO*** Using example data source [java:jboss/datasources/ExampleDS]
Warning: The encoding 'UTF-8' is not supported by the Java runtime.
? The JPA provider [HIBERNATE], also supplies extended APIs. Install these as well? [y/N] [false]
Wrote /Users/paul/arquillian-demo/pom.xml
Wrote /Users/paul/arquillian-demo/src/main/resources/META-INF/persistence.xml
现在开始创建 Entity。
$ entity --named Language --package demo.entities
Created @Entity [demo.entities.Language]
Picked up type <JavaResource>: demo.entities.Language
Wrote /Users/paul/arquillian-demo/src/main/java/demo/entities/Language.java
然后向这个 Entity 中添加一些属性。
$ field string --named name
Added field to demo.entities.Language: @Column private String name;
Wrote /Users/paul/arquillian-demo/src/main/java/demo/entities/Language.java
你必须复制下面这个文件到你的项目中。
src/main/java/demo/dao/LanguageDao.java
package demo.dao;
import demo.entities.Language;import javax.annotation.PostConstruct;import javax.ejb.Singleton;import javax.ejb.Startup;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import java.util.List;
@Singleton@StartuppublicclassLanguageDao{@PersistenceContextEntityManager em;
publicList<Language> listLanguages(){return em.createQuery("select l from Language l").getResultList();}
@PostConstructpublicvoid insertTestData(){Language java =newLanguage(); java.setName("Java"); em.persist(java);
Language ruby =newLanguage(); ruby.setName("Ruby"); em.persist(ruby);
Language groovy =newLanguage(); groovy.setName("Groovy"); em.persist(groovy);}}
现在开始创建我们的测试类,如果你已经完成了教程的上半部分,这个命令也类似。
$ arquillian create-test --class demo.dao.LanguageDao.java --enableJPA
Picked up type <JavaResource>: demo.dao.LanguageDemoTest
Wrote /Users/paul/arquillian-demo/src/test/java/demo/dao/LanguageDemoTest.java
这个命令会创建一个测试类,并添加 persistence.xml 到测试的部署中。在 IDE 中打开这个测试类,添加 Language
到部署中。
现在添加一个测试断言:
src/test/java/demo/dao/LanguageDaoTest.java
@Testpublicvoid testListLanguages(){Assert.assertEquals(3, languagedao.listLanguages().size());}
恭喜你! 另一个 Arquillian (greenbar) 绿条 !
添加其它容器
添加其它容器很简单,只需再次运行 setup 命令。例如,添加 Glassfish。
$ arquillian setup --container GLASSFISH_3_1_REMOTE
在容器之间切换只需要切换 Maven profile。例如在 Forge中:
$ build test --profile glassfish-remote-3
导出部署包
为了调试,将测试导出到一个部署文件非常有用。Forge 可以帮你完成。
首先转到一个 Arquillian 测试:
$ cd src/test/java/demo/MySimpleBeanTest.java
然后导出部署文件:
$ arquillian export
你可以在项目中 target 目录中找到这个部署文件。