@867976167
2014-09-04T17:49:47.000000Z
字数 4099
阅读 2043
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的概念。
我们的测试资源(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.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
- Shrinkwrap resolver API page (lots of nice examples for this powerful API)
- Defining Datasources for Wildfly 8.1
参考Java EE7 and Maven project for newbies – part 7from our JCG partner Paris Apostolopoulos at the Papo’s log blog.