使用外星人进行测试:如何使用Arquillian测试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.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>編寫測試
要設置測試環境,我們需要做兩件事。 首先,我們需要告訴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批注來驗證數據庫并使用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
總結
以上是生活随笔為你收集整理的使用外星人进行测试:如何使用Arquillian测试JPA类型转换器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq频道发帖教程(qq论坛发帖怎么发)
- 下一篇: 3ds模拟器电脑版下载(3ds模拟器电脑