从前面的部分恢复
第1 部分 , 第2 部分 , 第3 部分 , 第4 部分 , 第5部分
在上一篇文章(第5部分)中,我们发现了如何使用Arquillian(我们的EJB服务)进行单元测试,并将其部署在Wildfly8.1应用服务器的“真实”实例中。 扩展前面的示例,我们将添加更多配置和代码,以便我们可以添加涉及JPA2实体的单元测试。 从数据库创建,保存和检索信息是任何JavaEE应用程序的一项非常基本的任务。 我们需要确保我们的域模型和在其之上编码的逻辑经过了尽可能多的测试。 我将使用“ 最简单的 ”配置形式和相关库。 由于我们已经针对Wildfly 8.1进行了测试,因此我们将使用与服务器捆绑在一起的内部H2内存数据库以及相关的ExampleDS数据源 。
请注意 ,这仅是用于测试和演示,在现实生活中,您将需要在基于大量生产的RDBMS下进行测试,您应该做到以下几点:
- 在您的数据库服务器(例如Oracle,MySQL,DB2…)中创建测试数据库模式
- 将适当的数据源配置添加到应用程序服务器,以便它连接到上述数据库服务器。
我们已经设置了Arquillian,并且已经在利用独立的Wildfly 8.1应用服务器的功能。 在上一篇文章(第5部分)中,我们只是一个简单的Stateless EJB,它没有在数据库上检索或保存信息。 在样本域模块上,我们已经定义了一个简单的JPA2实体Bean。 我们想测试一些基本的东西,例如将实体保存在数据库中,检索实体等。即使对于如今,对于许多项目来说,创建无状态会话bean也是一种普遍的模式,实际上为每个实体实现此代码。 您可能听说过它们是“ DAO”类。 在我们的案例中,没有DAO实施,但是将应用相同的原则。
定义一个test-persistence.xml
由于我们已经在sample-domain模块(jar)下定义了一个标准的persistence.xml (实际上是在配置我们的实体管理器),因此我们需要进行类似的配置。 最终,一个非常相似的持久化xml,但这一次将被放置在/ src / test / resources文件夹中,因为它将为我们(在测试过程中从Arquillian / Wildfly测试组合。
它是这样的:
<?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>
以上文件的一些注意事项:
- 我们正在定义在Wildly 8.1上预先配置的ExampleDatasource
- WildFly 8.1与Hibernate 4.x捆绑在一起,因此我们正在使用Hibernate配置的“安全”属性。
- 我们正在使用“ 创建-删除 ”策略,这意味着每次运行测试时,hibernate都会将表拖放到基础数据库中并重新创建它们。 这将在我们正在尝试并且不断更改领域模型的情况下为我们提供帮助。
- 的胚胎。 Wildly提供的数据库是H2 ,因此我们正在配置Hibernate以使用此“ 方言 ”。
创建Arquillian测试
这是我们测试的样子(您可以在文章末尾的git链接上查看源代码):
以上代码的一些注意事项:
点0 :这是每个基于Arquillian的测试中最重要的部分之一。 这是我们在内存中创建“战争”的地方,我们的可部署内容将包含被测类和支持框架所需的任何其他资源。 所有的连接都是使用一个名为ShrinkWrap的基于Arquillian的框架完成的 。 在我们的示例中,“ createDeployment ”方法将打包我们的单个JPA实体“ User”和一个persistence.xml文件,该文件实际上是我们测试资源下的test-persistence.xml,并配置了使用默认设置的实体管理器疯狂的数据源。
要点1:这是一个特殊的批注,在更复杂的测试中非常方便,通过使用此批注,我们实际上是在默认情况下将JTA(事务性)支持注入到我们的测试方法中,在这种特殊测试中,使用量不大。 记下“回滚”设置。 它表明无论该测试方法在事务中最后执行什么操作,所有插入/删除/更新都将被回滚,因此我们不会留下任何垃圾。
第2点:我们需要使用适当的RunWith注释对测试进行注释,这表明我们希望启用Junit / Arquillian机制。
第3点:我们正在注入一个实体管理器,就像在常规EJB / resource中那样。 持久性管理器的名称必须与test-persistence.xml中定义的名称保持一致,因此请当心。
要点4: @Before注释表示init()方法将在每次测试之前运行。 这是初始化任何数据并准备我们的测试域环境的好地方。
第5点:您可以在init()方法中看到,我们正在保留一个User实体,这与我们在产品/实际代码中所做的类似!
第6点:我们正在尝试查询对象的实际测试方法,此后继续存在。
最后
实际上,我们已经配置并准备了项目结构和配置以便使用Arquillian,这一事实实际上是最重要的。 一旦准备好了基本块,那么就需要编写更多的测试并试验代码。 右键单击测试,如您所见,我们获得了成功的绿灯,这是一个明确的通过。 测试愉快!
- 您可以在我的bitbucket存储库中的post6标记下找到此帖子的完整代码。
翻译自: https://www.javacodegeeks.com/2014/06/java-ee7-and-maven-project-for-newbies-part-6.html