针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试
從前面的部分恢復
第1 部分 , 第2 部分 , 第3 部分 , 第4部分 ,
這是第一篇“額外”的帖子,基于我正在此系列博客文章上“構建”的Maven JavaEE7演示項目。 我們已經定義了一個堅實的結構和一些模塊。 在這樣的應用程序中,一個非常常見的情況是使用Arquillian (+ JUnit ),這是一個上帝賜予的框架,它使我們能夠使用“真實的”應用程序服務器對EJB服務進行單元測試,最有可能與我們將要使用的相同。部署到。 我實際上遵循的是這里的基本設置指南,不同之處在于,我將Wildfly 8.1設置為嵌入式容器來承載單元測試。 Widlfy 8.1是一個功能強大的JavvaEE7容器,因此我可以安全地測試所有功能。
Arquillian心態和Maven
為了在Maven化的項目中采用Arquillian,您需要了解的基本知識之一是以下實際上作為依賴項實現的術語(思想)。
- 當然,您需要Arquillian框架/庫,想象一下這是一輛新車,但缺少它的引擎。 前部是空的。
- 您需要一個Arquillian Container Adapter ,假設您需要在汽車的前部安裝某種占位符 ,例如將要使用的框架,以便可以“安裝”發動機。
- 您需要一個真正的容器(應用程序服務器),這是我們要安裝在汽車中的引擎 。
- 您需要JUnit ,這是您的汽車將要運行并進行測試的“ 測試 軌道 ”。
- 您需要您的代碼(您的EJB),這些代碼將被放置在汽車中并在Junit軌道上測試行程的乘客。
定義對父pom的依賴
正如我們在前4個帖子中已經詳細說明的那樣,父pom是定義要在我們的應用程序中使用的依賴項及其庫版本的地方。 請記住上面的術語列表,讓我們開始并更新父pom的dependencyManagement部分。
<junit-version>4.11</junit-version><arquillian-version>1.1.4.Final</arquillian-version><arquillian-wildfly-version>8.1.0.CR2</arquillian-wildfly-version><arquillian-transaction-version>1.0.1.Final</arquillian-transaction-version></properties><dependencyManagement><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>${javaee-api-version}</version></dependency><!-- -JUNIT--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit-version}</version></dependency><!-- rquillian itself--><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>${arquillian-version}</version><scope>import</scope><type>pom</type></dependency><!-- this is in an extention to arquillian it is optional--><dependency><groupId>org.jboss.arquillian.extension</groupId><artifactId>arquillian-transaction-bom</artifactId><version>${arquillian-transaction-version}</version><type>pom</type><scope>import</scope></dependency><!-- this is container adapter for wildfly--><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-arquillian-container-embedded</artifactId><version>${arquillian-wildfly-version}</version></dependency><!-- this is the wildfly emb.container - BUT eventually it is not a fully blown emb.container--><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-embedded</artifactId><version>${arquillian-wildfly-version}</version></dependency></dependencies></dependencyManagement>有關上述片段的一些技巧:
- 一些依賴項是pom類型和作用域導入。 實際上,這是一起定義依賴項組的一種特殊情況。 pom類型依賴性表示這是在此定義下分組在一起的一組單個庫。 您只需要定義該超級pom,您將繼承其中的各個依賴項。 在Maven術語中,這種依賴性分組稱為“ BOM ”或也稱為“ 物料清單 ”。 Arquillian由幾個具體的庫和依賴項組成,而不是一個一個地定義每個庫,如果定義arquillian-bom,則結果相同。
- “ arquillian-transaction-bom ”是一個可選的依賴項,您可以不定義它,它為Arquillian引擎和您的測試中添加了額外的功能。 最著名的“額外”功能之一是“ @Transactional” arquillian注釋。 在此處或此處查看詳細信息。
- Wildfly和JBoss的特殊情況。 您會注意到依賴項“ wildfly-embedded ”,并假設它是Wildfly應用程序服務器的“ 嵌入式 ” uber jar版本,例如Glassfish的版本。 最終不是這樣,這是人們在嘗試使用Wildfly設置Arquillian時常犯的錯誤。 為了使整個工作正常進行,您需要下載“真實的”應用程序服務器。 請看以下部分,將在哪里解決這個特殊情況。
為Arquillian和測試配置我們的ejb模塊
在演示應用程序中,我們已將大多數EJB服務“編碼”在名為sample-ejb的模塊上。 因此,我們需要在其pom中添加額外的配置,以便在該模塊的測試階段“ 觸發 ” junit + arquillian測試。
大多數配置將在此pom上執行,以覆蓋Widlfly的這種“ 特殊 ”情況,即未作為完全吹入的嵌入式容器提供。 因此,為了使整個機制正常工作,我們需要在測試階段告訴Maven,下載Wildfly.zip(例如,使用瀏覽器進行此操作),將其解壓縮到某個地方,然后將Arquillian指向路徑。 完成后,rAquillian將接任。
事先下載wildfly服務器
下面的配置寫在sample-services pom(我們的“ EJB服務”模塊)中:
<plugin><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>unpack</id><phase>process-test-classes</phase><goals><goal>unpack</goal></goals><configuration><artifactItems><artifactItem><groupId>org.wildfly</groupId><artifactId>wildfly-dist</artifactId><version>8.1.0.Final</version><type>zip</type><overWrite>false</overWrite><outputDirectory>target</outputDirectory></artifactItem></artifactItems></configuration></execution></executions></plugin>有關上述片段的一些技巧:
- 我們使用maven-dependency-plugin
- 我們指示插件在Maven生命周期的“過程測試類”階段啟動,以及在執行“解壓”目標時啟動。 因此,在Maven開始運行測試之前,配置的上述部分將已將Wildfly 8.1下載并解壓縮到類路徑中。
使用maven運行測試– surfire插件
同樣,下面的代碼是sample-services.pom的一部分。 我們實際上配置了Maven Surefire插件,它是執行Junit-Arquilian測試的插件。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><!-- Fork every test because it will launch a separate AS instance --><forkMode>always</forkMode><systemPropertyVariables><java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager><jboss.home>${project.basedir}/target/wildfly-8.1.0.Final</jboss.home><module.path>${project.basedir}/target/wildfly-8.1.0.Final/modules</module.path></systemPropertyVariables><redirectTestOutputToFile>false</redirectTestOutputToFile>/configuration></plugin>有關上述片段的一些技巧:
- Surefire為單元測試提供了執行環境。 在我們的案例中,我們有Junit-Arquillian進行的測試。 為了使Arquillian正確地初始化自身并標識容器,我們需要將其作為系統參數傳遞給下載應用程序服務器的路徑。 請記住,wildfly / jboss是一個特例。 該容器將已經下載到/ target文件夾中。
在sample-services模塊上添加所需的依賴項
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-container</artifactId><scope>test</scope></dependency><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-arquillian-container-embedded</artifactId><scope>test</scope></dependency><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-embedded</artifactId><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.extension</groupId><artifactId>arquillian-transaction-jta</artifactId><scope>test</scope></dependency>創建樣本測試
package gr.javapapo;import org.jboss.arquillian.container.test.api.Deployment;import org.jboss.arquillian.junit.Arquillian;import org.jboss.shrinkwrap.api.ShrinkWrap;import org.jboss.shrinkwrap.api.asset.EmptyAsset;import org.jboss.shrinkwrap.api.spec.JavaArchive;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;import javax.ejb.EJB;/*** Created by papo on 5/31/14.*/@RunWith(Arquillian.class)public class DemoArquillianTest {@EJBUserServices dummyService;@Deploymentpublic static JavaArchive createDeployment() {return ShrinkWrap.create(JavaArchive.class).addClass(UserServices.class).addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");}@Testpublic void testSaysHello() {Assert.assertEquals("hello",dummyService.sayHello());}}我們完了
在樣本父文件夾級別下,鍵入:
mvn clean package- 該示例的完整代碼可在以下bitbucket標簽上找到。
翻譯自: https://www.javacodegeeks.com/2014/06/java-ee7-and-maven-project-for-newbies-part-5-unit-testing-using-arquillian-wildfly-8.html
總結
以上是生活随笔為你收集整理的针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Integration J
- 下一篇: 聚氨酯鞋底好吗 聚氨酯鞋底好不好