快速入门:使用 Forge

Authors: Paul Bakker, Lincoln Baxter, III Translator: Hantsy Bai Language:
Last Update:Apr 19, 2012

本教程让你熟悉使用 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
@Startup
public class LanguageDao {
    @PersistenceContext
    EntityManager em;

    public List<Language> listLanguages() {
        return em.createQuery("select l from Language l").getResultList();
    }

    @PostConstruct
    public void insertTestData() {
        Language java = new Language();
        java.setName("Java");
        em.persist(java);

        Language ruby = new Language();
        ruby.setName("Ruby");
        em.persist(ruby);

        Language groovy = new Language();
        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
@Test
public void 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 目录中找到这个部署文件。

Share the Knowledge

Find this guide useful?

There’s a lot more about Arquillian to cover. If you’re ready to learn more, check out the other available guides.

Feedback

Find a bug in the guide? Something missing? You can fix it by forking this website, making the correction and sending a pull request. If you’re just plain stuck, feel free to ask a question in the user discussion forum.

Recent Changelog

  • Apr 19, 2012: Remove redundant metadata (internal change) by Dan Allen
  • Apr 05, 2012: Add reference_rev prolog field for translations by Dan Allen
  • Apr 05, 2012: Use description in prolog for guide summary by Dan Allen
  • Feb 10, 2012: Identify authors & translators by site identity by Dan Allen
  • Feb 06, 2012: Update translated title by Hantsy Bai
  • Jan 30, 2012: Change language code from zh to zh_cn by Dan Allen

See full history »