Java EE7和Maven工程入门(6),ee7maven
Java EE7和Maven工程入门(6),ee7maven
这篇讲解是接着前面的几讲的,如果需要回顾前面部分的同学,可以前往以下链接:
目录
- 一个简单Maven工程的结构
- 建立一个简单的WAR工程
- 定义ejb services模块和jpa实体模块
- 定义EAR模块
- 使用Arquillian进行单元测试(上)
- 使用Arquillian进行单元测试(下)
在上一篇(使用Arquillian进行单元测试(上))中,我们展示了如何去将我们的应用程序部署到一个“真实”运行的Wildfly8.1实例上,从而可以使用Arquillian进行单元测试。这次我们将在前面代码的基础上再去添加一些配置和代码,从而可以将单元测试关联到我们的JPA2实例中去。由数据库去创建、保存、查询信息是任何JavaEE程序最最基础的功能。我们就需要确保我们的域模型和逻辑代码经历尽可能多的测试。我将会使用最简配置。由于之前已经在Wildfly 8.1中运行过测试,我们将使用服务器内置的H2内存数据库以及相关的ExampleDS数据库。
注意:这里仅仅是为了示例和测试,在实际的开发中必须使用重型的关系型数据库,以下几点区别需要注意下:
- 在你自己的数据库服务器中创建一个test模式(比如:Oracle、MYSQL、DB2等)。
- 在应用程序中进行相应的配置来连接上面创建的数据库。
我们已经配置好Arquillian,并且对Wildfly 8.1应用服务器在功能上进行了一定的扩充。在上一篇博文中,我们已经创建好了一个无状态的EJB程序,但是并没有从数据库中查询数据,也没有向数据库中保存。在Simple-Domain中我们已经定义好了一个简单的JPA2实例对象。我们将进行一些简单的测试,像将对象存储到数据库,从数据库中查询数据等操作。即使在今天,许多应用都在遵循如下模式:每个实例对象都需要实现自己的相关数据库操作代码。你或许听说过一个叫“Dao”的类。在我们的示例中虽然没有Dao这样的类,但我们一样遵循这样的原则。
定义一个test-persistence.xml配置文件
因为我们已经在sample-domain模块中定义好了一个标准的persistence.xml的持久化文件,它配置好了我们的实体对象管理器。我们还需要一个类似的配置文件。实际上这是一个非常相似的持久化xml配置文件,但是这个文件将被放置在/src/test/resources目录下。因为这样配置之后,在测试的过程中就会从Arquillian/Wildfly测试套件中取出一个实体Manager。
配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="test"> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> </properties> </persistence-unit> </persistence>
注意:
- 配置文件中用到的ExampleDatasource数据源是已经在Wildfly8.1中配置好的。
- 因为在Wildfly8.1中已经内置了Hibernate4.X,所以我们可以在配置文件中随心所欲的使用Hibernate的配置属性。
- 我们使用的是create-drop策略,也就是每次运行测试用例都会将创建的表丢弃并重新创建。这样可以避免我们在测试过程中持续修改域模型而带来的麻烦。
- Wildfly提供的内置数据库是H2,所以要是用H2的方言。
创建Arquillian测试用例
具体代码如下截图(完整代码可以去Github下载):
注意:
- 这段代码是所有基于Arquillian测试的重要部分。这部分代码中,我们将创建基于内存的WAR包。部署包中将包含我们要测试的类以及使用的框架所需要的所有资源。所有的整合都是由一个基于Arquillian叫做ShrinkWrap的框架。在我们的测试用例中,createDeployment方法会将我们的UserJAP实体和**persistence.xml文件一起打包,这个xml文件就是test目录下的那个配置文件,它配置了一个使用Wildfly默认数据库的实体管理器。
- 这个注解非常特别。在复杂的测试环境中仍然可以非常方便地使用。使用这个注解就可以在方法上注入JTA事务支持,但是我们的这个示例中没有太多地用到这个特性。请注意回滚的设置:无论测试过程中对数据库进行了怎样的操作,在测试结束之后都会回滚到测试之前的状态,不留一点点痕迹。
- 我们需要在测试的方法上加上合适的注解,以使Junit/Arquillian机制生效。
- 我们注入的实体管理器就像在一般的EJB中使用一样。实体管理器的名称必须和test-persistence.xml文件中的配置一致,所以这里一定要注意。
@Before
注解指的是init()方法的执行,进行测试之前的初始化工作。在这个过程中进行数据初始化以及创建测试域模型等准备工作再合适不过了。- 正如你在init()方法中看到的一样,我们初始化了一个User实例,跟我们在真实的生产环境中写的代码一样!
- 真正的测试部分,我们是要去查询一些实体对象,并将它们持久化。
总结
实际上,我们在测试之前进行的配置工作、域模型对象的准备以及为了使用Arquillian框架做的配置才是最重要的部分。当最基础的准备工作做好后,剩下的工作就是编写更多的测试用例以及实验代码了。右击测试开始,正如你截图中看到的一样,一片“绿油油”,干净利落的通过了测试,开心测试结束!
大家可以在这里找到本文的源代码。
用户点评