Java EE7和Maven工程入门(7)

目录

  1. 一个简单Maven工程的结构
  2. 建立一个简单的WAR工程
  3. 定义ejb services模块和jpa实体模块
  4. 定义EAR模块
  5. 使用Arquillian进行单元测试(上)
  6. 使用Arquillian进行单元测试(下)
  7. 使用PostagreSQL与ShrinkWrap API进行测试

编辑注:第4、5部分正在翻译中。

上一次,我们讲述了如何使用Arquillian和Wildfly8.1对我们的JPA2域模型进行单元测试。在此之前,我们只是使用绑定在Wildfly8.1内部的H2数据库作为数据源 (ExampleDS)。但是对于一个真正的DBMS要怎么做?这一部分,我们将会使用相同的原则对先前的内容进行扩展,并且

  • 对运行在本地的PostagreSQL进行测试
  • 使用Arquillian提供的一些很好用的ShrinkWrap API。

事先准备

你需要安装 PostgreSQL。我使用的数据库运行在本地服务器,数据库名papodb。

添加额外的依赖

我们需要在父类项目(POM)增加更多的依赖。一些与Arquillian和 ShrinkWrap Resolvers的特性有关(以后会更多)。

因此我们在我们的父pom.xml添加如下内容:

<shrinkwrap.bom-version>2.1.1</shrinkwrap.bom-version>

  <!-- jbdc drivers -->
 <postgreslq.version>9.1-901-1.jdbc4</postgreslq.version>
...
   <!-- shrinkwrap BOM-->
<dependency>
        <groupId>org.jboss.shrinkwrap.resolver</groupId>
        <artifactId>shrinkwrap-resolver-bom</artifactId>
        <version>${shrinkwrap.bom-version}</version>
        <type>pom</type>
        <scope>import</scope>
  </dependency>
   <!-- shrinkwrap dependency chain-->
  <dependency>
        <groupId>org.jboss.shrinkwrap.resolver</groupId>
        <artifactId>shrinkwrap-resolver-depchain</artifactId>
        <version>${shrinkwrap.bom-version}</version>
       <type>pom</type>
  </dependency>

  <!-- arquillian itself-->
   <dependency>
      <groupId>org.jboss.arquillian</groupId>
      <artifactId>arquillian-bom</artifactId>
       <version>${arquillian-version}</version>
      <scope>import</scope>
      <type>pom</type>
   </dependency>

<!-- the JDBC driver for postgresql -->
 <dependency>
     <groupId>postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>${postgreslq.version}</version>
 </dependency>

对上面变化的提示:

  • 为了避免依赖之间冲突的威胁,确定ShrinkWrap BOM的定义在Arquillian BOM之上。

现在为了对这个服务样本进行简单的测试,我们需要引用一些依赖:

<dependency>
     <groupId>org.jboss.shrinkwrap.resolver</groupId>
     <artifactId>shrinkwrap-resolver-depchain</artifactId>
     <scope>test</scope>
     <type>pom</type>
 </dependency>

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

重构测试代码

在前面的例子中,我们只是用了一个测试的配置文件进行了简单的测试。这会导致,虽然我们把test应用打包成jar文件,但只有一个test- persistence.xml而没有web.xml文件。现在,我们把test项目升级为war包。在JavaEE7中,当我们构建并部署一个企业级应用,优先选择打包为war文件。与前面的例子主要的差别是,这里保留了先前测试Wildfly数据库H2的配置文件并且新设置也可以用来测试服务器上运行的DBMS。所以我们保留两种配置文件,并且利用Maven 的profile特性根据我们的模式使用它们。如果你是Maven新手,请确保知道profiles的概念。

为每个profiles添加单独的配置文件

我们的测试资源(src/test/resources下面的文件)如下图所示

这两个案例之间有一点不同。h2的test-persistence.xml指向的是ExampleDS数据源,另一个在PostgreSQL指向的是新添加定义在web.xml中的数据源!你可以从下面的git链接下载代码进行查看。

在web.xml中定义数据源:

小结一下:

  • 在JNDI中标准的命名是java:jboss/datasources/datasourceName。
  • 应用服务器一旦读取了web.xml的内容,将会自动部署和配置一个新的数据源。

下面是persistence.xml:

对上述内容的总结:

  • 确保在persistence.xml定义的数据源中JNDI属性是相同的。
  • 对于使用postGresql的Hibernate方言是不同的。
  • 高亮显示的行是为Wildfly8.1特别配置,允许你一次性部署数据源 JDBC驱动和代码。它会初始化应用服务器,配置第一个数据源并初始化EntityManager。本案例中早已经配置且部署好这个数据源,所以这是不需要的。

在pom文件中定义profile

在我们的示例服务pom.xml文件中添加下面部分,即我们的profile定义:

  <profiles>
   <profile>
        <id>h2</id>
         <build>
           <testResources
             <testResource>
                    <directory>/resources-h2</directory>
                        <includes>
                            <include>**/*</include>
                      </includes>
                    </testResource>
               </testResources>
            </build>
   </profile>
   <profile>
       <id>postgre</id>
         <build>
           <testResources>
              <testResource>
                  <directory>/resources-postgre</directory>
                    <includes>
                            <include>**/*</include>
                      </includes>
                </testResource>
            </testResources>
         </build>
   </profile>
</profiles>

根据profile是否激活,让Maven知道需要使用哪一个特定子文件下的xml文件。我们将会很乐意使用下面的命令:

mvn clean test -Pdb2

接下来,maven将会使用在resource-h2文件下的persistence.xml和 web.xml。我们的test将会使用内部H2 DB。如果还是有问题,我们可以执行:

mvn clean test -Ppostgre

这样我们的test web项目将会用特别定义在本地的postgresql服务器打包数据。

一个简单的测试

最后,我们新的单元测试和我们先前的测试会有很大不同。以下是关键代码的截图:

关于上面的建议

  • 这个单元测试和基本的注解和前面部分是一样的。
  • init()方法也是一样的,我们只是创建并持久化一个新SImpleUser实体。
  • 最主要的不同是,使用了在我们的pom做了依赖的SkrinkWrap API。并且我们可以把JDBC驱动作为一个jar包定位。一旦定位到ShrinkWrap,将会它将会把剩余的资源和代码打包为test.war。
  • 只打包jdbc驱动是不够的。为了能够工作,我们的服务器需要实现(配置)一个数据源。我们希望这些工作能自动完成,这意味着我们不想预先在Wildfly服务器上配置任何东西。我们可以充分利用在web.xml配置数据源的特性:

  • 一旦应用服务器扫描到web.xml文件,将会获得配置信息并用java:jboss/datasources/testpostgre名字配置一个数据源。
  • 我们已经绑定好了驱动、数据源定义。我们有一个persistence.xml 文件指向正确的数据源,这时可以准备测试了。
  • 我们的测试方法与之前的方法类似。

我们对H2的配置做了一点修改,也可以随时打包相同结构的war文件。这意味着,如果我们用-Ph2的配置运行test,web.xml不包含任 何东西的。因为我们实际上不必在这定义一个数据源,这个数据源早已经被Wildfly部署好了。在本文的示例中,由于H2的方言定义与PostgreSQL不同,persistence.xml也不同。

你可以按照相同的原则并且添加一个新的资源文件。为类似MySQL这样其他DBMS配置一个数据源,并通过代码获得驱动将它打包。

你可以在bitbucket repo-tag获得这一部分的代码。

资源

原文链接: javacodegeeks 翻译: ImportNew.com - 好好先生
译文链接: http://www.importnew.com/13420.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 好好先生

(新浪微博:@好好先生耶2

查看好好先生的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部