jpa 测试

该帖子与+ Aslak Knutsen ( @aslakknutsen )一起撰写。

JPA类型转换器为定义实体属性如何持久存储到数据库提供了一种简便的方法。 您可以使用它们来实现许多不同的功能,例如,如上一篇文章中所示:加密数据: 如何使用JPA Type Converter加密数据 。

但是编写类型转换器是不够的。 我们还需要确保其正常运行。

通常,有两种方法可以测试类型转换器。 我们可以编写一个单元测试来检查转换是否正常工作。 但是,单元测试可以对隔离的类进行测试,而无需将其放入实际的执行环境中。 这意味着我们仍然不知道转换器是否可以在我们的应用程序之一中工作。 如果一切设置正确,则持久性提供程序将在写入数据库和从数据库读取之前调用转换器。 因此,我们还需要检查持久性提供程序是否调用了类型转换器,以及在这种情况下一切是否正常。 我们需要在要用于我们的应用程序的容器内测试转换器。

我们将看看如何使用Arquillian及其持久性扩展来完成此任务。

关于Arqillian

如果您已经熟悉Arquillian,则可以跳过此部分。 对于到目前为止从未与Arquillian合作的所有人,我只想提供一些基本信息。 您可以在《 Arquillian 入门指南》中找到更详细的描述。

Arquillian是用于容器测试的测试框架。 这个想法是不要模拟您要使用的容器,而是在其中测试您的代码。 这样做的好处是,您可以测试代码是否还可以在执行环境中工作,而不仅是在模拟的测试场景中。 Arquillian提供了许多功能来管理容器,注入所需的资源(例如EJB或EntityManager),并使您的工作变得更加轻松。

Arquillian测试由junit执行。 这很棒,因为您可以在可以执行junit测试的任何地方使用它们。 这意味着在您的IDE中,作为构建过程的一部分,您可以在CI服务器上的任何地方。

被测对象

下面的代码片段显示了此示例中的测试对象。 这是一个类型转换器,用于加密和解密String属性。 在写入数据库和从数据库读取之后,持久性提供程序将调用该转换器。 如果您想了解有关此类型转换器如何工作的更多信息,请查看有关它的文章 。

@Converter
public class CryptoConverter implements AttributeConverter<String, String> {private static final String ALGORITHM = "AES/ECB/PKCS5Padding";private static final byte[] KEY = "MySuperSecretKey".getBytes();@Overridepublic String convertToDatabaseColumn(String ccNumber) {// do some encryptionKey key = new SecretKeySpec(KEY, "AES");try {Cipher c = Cipher.getInstance(ALGORITHM);c.init(Cipher.ENCRYPT_MODE, key);return Base64.encodeBytes(c.doFinal(ccNumber.getBytes()));} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic String convertToEntityAttribute(String dbData) {// do some decryptionKey key = new SecretKeySpec(KEY, "AES");try {Cipher c = Cipher.getInstance(ALGORITHM);c.init(Cipher.DECRYPT_MODE, key);return new String(c.doFinal(Base64.decode(dbData)));} catch (Exception e) {throw new RuntimeException(e);}}
}

设定

在开始编写测试之前,我们需要定义一些依赖关系。 我将仅展示如何配置此示例所需的依赖项。 如果您尚未为项目设置Arquillian测试,则必须做更多的工作。 请查看入门指南,以了解如何为您的项目设置Arquillian。 不要害怕,没有太多的事情要做。

如下面的代码片段所示,我们将使用JUnit 4.11Arquillian 1.1.3.FinalArquillian Persistence Extension 1.0.0.Alpha7WildFly Application Server 8.1.0.Final

<?xml version="1.0" encoding="UTF-8"?>
<projectxsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">...<properties><version.junit>4.11</version.junit><version.arquillian>1.1.3.Final</version.arquillian><version.arquillian_persistence>1.0.0.Alpha7</version.arquillian_persistence><version.wildfly>8.1.0.Final</version.wildfly></properties><dependencyManagement><dependencies>...<dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>${version.arquillian}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies>...<dependency><groupId>javax.enterprise</groupId><artifactId>cdi-api</artifactId><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${version.junit}</version><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-container</artifactId><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.extension</groupId><artifactId>arquillian-persistence-dbunit</artifactId><version>${version.arquillian_persistence}</version><scope>test</scope></dependency></dependencies>

编写测试

要设置测试环境,我们需要做两件事。 首先,我们需要告诉junit该测试应作为junit测试执行。 这是通过@RunWith(Arquillian.class)

另外,我们需要创建测试部署,该部署将部署到容器中。 因此,我们需要实现至少一种方法,并使用@Deployment对其进行@Deployment 。 如下面的代码片段所示,我们使用ShrinkWrap创建jar存档部署。 存档包含CreditCard实体, CryptoConverter类型转换器和测试类。 无需包括任何实现业务逻辑的EJB或其他类。 我们可以将EntityManager注入我们的测试用例中,并直接使用它来持久化和读取实体。 稍后我们将对其进行更详细的介绍。

另外,我们需要添加一些清单资源来创建一个持久性单元,注册类型转换器并添加一个空的beans.xml来激活CDI。 请查看入门指南,以获取有关ShrinkWrap和创建部署的更多信息。

@RunWith(Arquillian.class)
public class TestCryptoConverter {@Deploymentpublic static JavaArchive createDeployment() {return ShrinkWrap.create(JavaArchive.class).addClasses(CreditCard.class, CryptoConverter.class,TestCryptoConverter.class).addAsManifestResource("META-INF/persistence.xml","persistence.xml").addAsManifestResource("META-INF/orm.xml", "orm.xml").addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");}

完成之后,我们可以开始编写测试用例了。 首先,我们将保留一个CreditCard实体,并检查信用卡号是否已通过CryptoConverter加密。 因此,我们注入了EntityManager,创建了CreditCard实体,并将其传递给EntityManager的persist方法。 持久化数据的验证由Arquillian持久性扩展完成。 我们只需要定义我们希望写入数据库的数据即可。 预期数据在cc.yml文件中定义,该文件在@ShouldMatchDataSet批注中引用。 由于id属性是由数据库生成的,因此我们希望将其从验证中排除。 这可以通过在注释的excludeColumns属性中引用它来完成。

@PersistenceContextprivate EntityManager em;@Test@ShouldMatchDataSet(value = "data/cc.yml", excludeColumns = "id")public void testEncryption() {CreditCard cc = new CreditCard();cc.setName("My Name");cc.setCcNumber("123456789");this.em.persist(cc);}

cc.yml包含以下信息。

CreditCard:- id: 1name: My NameccNumber: egFfkhd8cRh82tvsh3VVUg==

在第二个测试中,我们将检查是否可以在数据库中搜索具有给定信用卡号的CreditCard实体。 因此,我们使用@UsingDataSet批注为cc.yml文件中定义的数据播种数据库。 现在,我们可以使用注入的EntityManager来调用命名查询,以使用给定的编号搜索CreditCard实体。

@Test@UsingDataSet("data/cc.yml")public void testRead() {CreditCard cc = this.em.createNamedQuery(CreditCard.BY_NUMBER, CreditCard.class).setParameter("number", "123456789").getSingleResult();Assert.assertEquals("My Name", cc.getName());}

结论

我们使用Arquillian和Arquillian Persistence扩展来测试JPA类型转换器。 因此,我们注入了EntityManager并使用批注@ShouldMatchData@UsingDataSet来验证数据库并@UsingDataSet添加yml文件。

如果您想自己尝试,可以在github上找到源代码。
您可以通过调用以下命令来运行它:git clone https://github.com/thjanssen/JPA2.1.git && cd JPA2.1 / CryptoConverter && mvn测试。

使用Arquillian测试Java EE应用程序有什么经验? 请对此发表评论。
想要了解有关Arquillian的更多信息,请参阅Arquillian Guides: http ://arquillian.org/guides/

翻译自: https://www.javacodegeeks.com/2014/06/testing-with-aliens-how-to-test-a-jpa-type-converter-with-arquillian.html

jpa 测试

jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器相关推荐

  1. fiddler弱网测试_移动端质量体系之弱网测试

    Hi-新朋友,记得点蓝字关注我们哟 最近面试了不少同学,在答移动端质量体系时,都会说到兼容性测试.功能测试等等,但是几乎没有同学会提起弱网测试.其实弱网测试作为健壮性测试的重要部分,对于移动端测试来说 ...

  2. monkey测试_爱码小士丨 APP稳定性测试(附视频详解)

    在实际的测试过程中,主要是对系统的功能来进行测试,用于校验功能的正确性 还需要考虑到系统在未修改的状态下,是否能够稳定运行,即崩溃.闪退.重启.系统异常等等等地情况 在APP中,稳定性测试一般是交由M ...

  3. junit数据驱动测试_使用Junit和Easytest进行数据驱动的测试

    junit数据驱动测试 在本文中,我们将看到如何使用Junit进行数据驱动的测试. 为此,我将使用一个名为EasyTest的库. 我们知道,对于TestNG,它已内置了数据提供程序. 通过简单的测试, ...

  4. 怎样对流媒体进行压力测试_四合一气体检测仪怎样进行气体测试?

    我们都知道四合一气体检测仪在农业.化工.天然气等行业应用比较广泛,那么它到底是什么呢?四合一气体检测仪又是怎样进行气体测试的呢? 四合气体探测器使用特殊电路在两个点上测量探测器电流.当可燃气体进入回路 ...

  5. gdpr合规性测试_使用生产数据在GDPR后世界进行测试

    gdpr合规性测试 To SQL Server DBAs who are the shepherds of data in organizations, key GDPR questions, in ...

  6. 机器学习中qa测试_如何使用AI和机器学习的QA测试软件

    智能手机,智能扬声器,智能汽车,智能咖啡机......这个名单还在继续.看起来我们周围的一切都变得生机勃勃,变得聪明起来.尽管科幻类型依赖于我们对敌对机器人接管的恐惧,但智能设备绝不是反乌托邦 - 它 ...

  7. pdn阻抗测试_基于SIWAVE的PDN阻抗仿真与测试对比

    1 引言 电源配送网络(PDN)是当今系统设计中的主要挑战.随着系统的小型化和封装电路板中采用新的材料,这一挑战也与日俱增.随着器件规模变大,更多的晶体管被集成到一个芯片中:随着电压的降低,于此相对应 ...

  8. 网线传输速度测试_家中重新布了网线,要测试有没有达到千兆的网速,应该怎么做?...

    "极客谈科技",全新视角.全新思路,伴你遨游神奇的科技世界. 如何检测家庭局域网是否达到千兆,一直是困扰大家的难题. 今天就来讲讲如何实现家宽千兆局域网,特别是千兆网线如何进行测试 ...

  9. 使用外星人进行测试:如何使用Arquillian测试JPA类型转换器

    该帖子与+ Aslak Knutsen ( @aslakknutsen )一起撰写. JPA类型转换器为定义实体属性如何持久存储到数据库提供了一种简便的方法. 您可以使用它们来实现许多不同的功能,例如 ...

最新文章

  1. linux ftp服务
  2. 用 Java 对 hbase 进行CRUD增删改查操作
  3. 科大星云诗社动态20210221
  4. Java中return的两种用法
  5. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  6. [转载] Java中的命名参数
  7. 面试常考,项目易错!C/C++中的字节对齐
  8. 【转】高并发情况下的单例模式
  9. curl的get请求设置参数实例
  10. matlab 拟合平方根,matlab拟合工具箱cftool及其统计指标公式计算
  11. 设计模式 - 抽象工厂模式
  12. 快手的视频 发到抖音 怎么消重 视频md5值查询
  13. Visual Studio 2019 设置背景图
  14. python pandas clip
  15. Impala中的invalidate metadata 和refrsh
  16. 6.Spring学习笔记_Bean之间的关系 (by尚硅谷_佟刚)
  17. 学生报名太火热,黑马大门要被挤掉了?
  18. Revit版本对应的.NET框架版本
  19. sw钣金插件_沐风好课进行时!今晚八点直播讲解:SW非标设计之桁架机械手!...
  20. matlab判断矩阵是否非负,有关非负矩阵的MATLAB程序优化

热门文章

  1. POJ2115-C Looooops【扩欧,同余】
  2. 【jzoj】2018/2/2 NOIP普及组——D组模拟赛
  3. OJ4121 and OJ2968-股票买卖 and Maximun sum【各种dp之6 and 9】
  4. 2018 计蒜之道 复赛
  5. SpringBoot2.1.9 多Redis Lettuce配置
  6. String转Double
  7. 堆排序原理及其实现(C++)
  8. pre1-flink理论-批处理与流处理+简单示例
  9. fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...
  10. 自动化测试框架 2019_2019年用于自动化的5个最佳Java测试框架