Java EE7和Maven工程入门(7),ee7maven
Java EE7和Maven工程入门(7),ee7maven
目录
- 一个简单Maven工程的结构
- 建立一个简单的WAR工程
- 定义ejb services模块和jpa实体模块
- 定义EAR模块
- 使用Arquillian进行单元测试(上)
- 使用Arquillian进行单元测试(下)
- 使用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获得这一部分的代码。
资源
- Shrinkwrap resolver API page(包括很多强大的API定义)
- Defining Datasources for Wildfly 8.1
译文链接: http://www.wld5.com/13420.html
[ 转载请保留原文出处、译者和译文链接。]
用户点评