[关闭]
@867976167 2014-09-04T17:49:47.000000Z 字数 4099 阅读 2043

为新手准备的JavaEE和Maven项目 --第七部分


回顾先前的部分

Part#1 Part#2 Part#3Part#4 Part#5 Part#6

在上一部分(Part#6)我们讲述了如何使用Arquillian和Wildfly8.1对我们的JPA2域模型进行单元测试,在前面,我们只是使用的数据源(ExampleDS)是绑定在Wildfly8.1内部的H2数据库。但是一个真正的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。本案例中早已经配置且部署好这个数据源,所以这是不需要的。
    Define the profiles in our pom

在我们的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将会使用内部的H2DB 如果我们有问题也可以

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是不同的。

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

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

资源

参考Java EE7 and Maven project for newbies – part 7from our JCG partner Paris Apostolopoulos at the Papo’s log blog.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注