日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

jpa 測(cè)試

該帖子與+ Aslak Knutsen ( @aslakknutsen )一起撰寫(xiě)。

JPA類(lèi)型轉(zhuǎn)換器為定義實(shí)體屬性如何持久存儲(chǔ)到數(shù)據(jù)庫(kù)提供了一種簡(jiǎn)便的方法。 您可以使用它們來(lái)實(shí)現(xiàn)許多不同的功能,例如,如上一篇文章中所示:加密數(shù)據(jù): 如何使用JPA Type Converter加密數(shù)據(jù) 。

但是編寫(xiě)類(lèi)型轉(zhuǎn)換器是不夠的。 我們還需要確保其正常運(yùn)行。

通常,有兩種方法可以測(cè)試類(lèi)型轉(zhuǎn)換器。 我們可以編寫(xiě)一個(gè)單元測(cè)試來(lái)檢查轉(zhuǎn)換是否正常工作。 但是,單元測(cè)試可以對(duì)隔離的類(lèi)進(jìn)行測(cè)試,而無(wú)需將其放入實(shí)際的執(zhí)行環(huán)境中。 這意味著我們?nèi)匀徊恢擂D(zhuǎn)換器是否可以在我們的應(yīng)用程序之一中工作。 如果一切設(shè)置正確,則持久性提供程序?qū)⒃趯?xiě)入數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)讀取之前調(diào)用轉(zhuǎn)換器。 因此,我們還需要檢查持久性提供程序是否調(diào)用了類(lèi)型轉(zhuǎn)換器,以及在這種情況下一切是否正常。 我們需要在要用于我們的應(yīng)用程序的容器內(nèi)測(cè)試轉(zhuǎn)換器。

我們將看看如何使用Arquillian及其持久性擴(kuò)展來(lái)完成此任務(wù)。

關(guān)于Arqillian

如果您已經(jīng)熟悉Arquillian,則可以跳過(guò)此部分。 對(duì)于到目前為止從未與Arquillian合作的所有人,我只想提供一些基本信息。 您可以在《 Arquillian 入門(mén)指南》中找到更詳細(xì)的描述。

Arquillian是用于容器測(cè)試的測(cè)試框架。 這個(gè)想法是不要模擬您要使用的容器,而是在其中測(cè)試您的代碼。 這樣做的好處是,您可以測(cè)試代碼是否還可以在執(zhí)行環(huán)境中工作,而不僅是在模擬的測(cè)試場(chǎng)景中。 Arquillian提供了許多功能來(lái)管理容器,注入所需的資源(例如EJB或EntityManager),并使您的工作變得更加輕松。

Arquillian測(cè)試由junit執(zhí)行。 這很棒,因?yàn)槟梢栽诳梢詧?zhí)行junit測(cè)試的任何地方使用它們。 這意味著在您的IDE中,作為構(gòu)建過(guò)程的一部分,您可以在CI服務(wù)器上的任何地方。

被測(cè)對(duì)象

下面的代碼片段顯示了此示例中的測(cè)試對(duì)象。 這是一個(gè)類(lèi)型轉(zhuǎn)換器,用于加密和解密String屬性。 在寫(xiě)入數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)讀取之后,持久性提供程序?qū)⒄{(diào)用該轉(zhuǎn)換器。 如果您想了解有關(guān)此類(lèi)型轉(zhuǎn)換器如何工作的更多信息,請(qǐng)查看有關(guān)它的文章 。

@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);}} }

設(shè)定

在開(kāi)始編寫(xiě)測(cè)試之前,我們需要定義一些依賴(lài)關(guān)系。 我將僅展示如何配置此示例所需的依賴(lài)項(xiàng)。 如果您尚未為項(xiàng)目設(shè)置Arquillian測(cè)試,則必須做更多的工作。 請(qǐng)查看入門(mén)指南,以了解如何為您的項(xiàng)目設(shè)置Arquillian。 不要害怕,沒(méi)有太多的事情要做。

如下面的代碼片段所示,我們將使用JUnit 4.11 , Arquillian 1.1.3.Final , Arquillian Persistence Extension 1.0.0.Alpha7和WildFly 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>

編寫(xiě)測(cè)試

要設(shè)置測(cè)試環(huán)境,我們需要做兩件事。 首先,我們需要告訴junit該測(cè)試應(yīng)作為junit測(cè)試執(zhí)行。 這是通過(guò)@RunWith(Arquillian.class) 。

另外,我們需要?jiǎng)?chuàng)建測(cè)試部署,該部署將部署到容器中。 因此,我們需要實(shí)現(xiàn)至少一種方法,并使用@Deployment對(duì)其進(jìn)行@Deployment 。 如下面的代碼片段所示,我們使用ShrinkWrap創(chuàng)建jar存檔部署。 存檔包含CreditCard實(shí)體, CryptoConverter類(lèi)型轉(zhuǎn)換器和測(cè)試類(lèi)。 無(wú)需包括任何實(shí)現(xiàn)業(yè)務(wù)邏輯的EJB或其他類(lèi)。 我們可以將EntityManager注入我們的測(cè)試用例中,并直接使用它來(lái)持久化和讀取實(shí)體。 稍后我們將對(duì)其進(jìn)行更詳細(xì)的介紹。

另外,我們需要添加一些清單資源來(lái)創(chuàng)建一個(gè)持久性單元,注冊(cè)類(lèi)型轉(zhuǎn)換器并添加一個(gè)空的beans.xml來(lái)激活CDI。 請(qǐng)查看入門(mén)指南,以獲取有關(guān)ShrinkWrap和創(chuàng)建部署的更多信息。

@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");}

完成之后,我們可以開(kāi)始編寫(xiě)測(cè)試用例了。 首先,我們將保留一個(gè)CreditCard實(shí)體,并檢查信用卡號(hào)是否已通過(guò)CryptoConverter加密。 因此,我們注入了EntityManager,創(chuàng)建了CreditCard實(shí)體,并將其傳遞給EntityManager的persist方法。 持久化數(shù)據(jù)的驗(yàn)證由Arquillian持久性擴(kuò)展完成。 我們只需要定義我們希望寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)即可。 預(yù)期數(shù)據(jù)在cc.yml文件中定義,該文件在@ShouldMatchDataSet批注中引用。 由于id屬性是由數(shù)據(jù)庫(kù)生成的,因此我們希望將其從驗(yàn)證中排除。 這可以通過(guò)在注釋的excludeColumns屬性中引用它來(lái)完成。

@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==

在第二個(gè)測(cè)試中,我們將檢查是否可以在數(shù)據(jù)庫(kù)中搜索具有給定信用卡號(hào)的CreditCard實(shí)體。 因此,我們使用@UsingDataSet批注為cc.yml文件中定義的數(shù)據(jù)播種數(shù)據(jù)庫(kù)。 現(xiàn)在,我們可以使用注入的EntityManager來(lái)調(diào)用命名查詢(xún),以使用給定的編號(hào)搜索CreditCard實(shí)體。

@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());}

結(jié)論

我們使用Arquillian和Arquillian Persistence擴(kuò)展來(lái)測(cè)試JPA類(lèi)型轉(zhuǎn)換器。 因此,我們注入了EntityManager并使用批注@ShouldMatchData和@UsingDataSet來(lái)驗(yàn)證數(shù)據(jù)庫(kù)并@UsingDataSet添加yml文件。

如果您想自己嘗試,可以在github上找到源代碼。
您可以通過(guò)調(diào)用以下命令來(lái)運(yùn)行它:git clone https://github.com/thjanssen/JPA2.1.git && cd JPA2.1 / CryptoConverter && mvn測(cè)試。

使用Arquillian測(cè)試Java EE應(yīng)用程序有什么經(jīng)驗(yàn)? 請(qǐng)對(duì)此發(fā)表評(píng)論。
想要了解有關(guān)Arquillian的更多信息,請(qǐng)參閱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 測(cè)試

總結(jié)

以上是生活随笔為你收集整理的jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。