日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

集成测试CDI 1.0和Spring 3.1中的作用域bean

發(fā)布時(shí)間:2023/12/3 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集成测试CDI 1.0和Spring 3.1中的作用域bean 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在這篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean進(jìn)行集成測試。 一切都用小代碼示例進(jìn)行說明。 使用范圍進(jìn)行集成測試并不是特別容易。 想象一下存在于會(huì)話范圍內(nèi)的bean,例如UserCredentials 。 在集成測試中,通常沒有HttpRequest或HttpSession可以使用(至少在不進(jìn)行包含用戶界面的測試時(shí))。 因此,您需要一些基礎(chǔ)架構(gòu)來進(jìn)行集成測試。 使用這兩種技術(shù),使此基礎(chǔ)結(jié)構(gòu)正常運(yùn)行有點(diǎn)令人困惑。 獲取您自己的照片。

如果您不熟悉CDI和Spring中的范圍和上下文,請查看基礎(chǔ)知識(shí)并獲得有關(guān)不同范圍的概述。

在Spring中集成測試作用域的bean

在Spring 3.1中,沒有針對作用域會(huì)話或請求Bean的集成測試支持(請參閱此處 )。 它計(jì)劃在Spring版本3.2中使用。 但是, 此鏈接說明了適用于我的解決方案。

首先,您需要為測試開發(fā)一個(gè)SessionScope。 目的是模擬HttpRequest和HttpSession。

package com.mycompany.springapp.scope;import org.springframework.beans.factory.InitializingBean; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.SessionScope;public class SetupSession extends SessionScope implements InitializingBean {public void afterPropertiesSet() throws Exception {MockHttpServletRequest request = new MockHttpServletRequest();MockHttpSession session = new MockHttpSession();request.setSession(session);RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));}}

要在您的test-beans.xml中將該類注冊為會(huì)話范圍管理對象,請執(zhí)行以下操作:

注意,我在context:component-scan標(biāo)記之后注冊了作用域 。

最后,我編寫了我的測試課:

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.Assert;@ContextConfiguration("/test-beans.xml") @RunWith(SpringJUnit4ClassRunner.class) public class MyScopeBeanTest {@Autowiredprivate MyScopeBean myScopeBean;@Testpublic void testBeanScopes() {Assert.isTrue(myScopeBean.getMyCustomScopedService().getName().equals("Test"));Assert.isTrue(myScopeBean.getMySessionScopedService().getName().equals("Test"));}}

注意,我已經(jīng)在作用域bean上調(diào)用了方法getName() 。 這對于確保范圍確定有效。 客戶端代理可能會(huì)在注入點(diǎn)被注入,但是如果您對代理進(jìn)行調(diào)用,則它不會(huì)分別引用作用域?qū)ο蠛蛥f(xié)作對象。

使用CDI集成測試作用域的bean

我用于集成測試CDI的工具是Arquillian 。 還有其他選擇。 如果僅使用CDI類進(jìn)行測試,則可以“本地”使用Weld。 但是,如果您也有EJB,那還不夠。 Arquillian帶有相當(dāng)數(shù)量的傳遞依賴項(xiàng)。 讓我們來看看如何使事情發(fā)展。

注意:沒有Maven,您會(huì)迷失在這里的沙漠中,因此,我鼓勵(lì)您使用它! 我已經(jīng)為Helios嘗試了m2eclipse,但對我來說卻不起作用,我使用Maven 3返回了舊的命令行。

對pom.xml文件的更改

這些示例假定您有一個(gè)Java EE項(xiàng)目正在運(yùn)行,您還可以在此處查看如何設(shè)置新的Java EE 6項(xiàng)目。 要集成Arquillian,請對pom.xml文件進(jìn)行以下更改:

在屬性部分:

1.0.0.Alpha5

添加此存儲(chǔ)庫:

repository.jboss.orghttp://repository.jboss.org/nexus/content/groups/publicdefaulttrueneverwarnfalsealwayswarn

這是官方的JBoss Maven存儲(chǔ)庫,所有Arquillian發(fā)行版都在其中。

將以下依賴項(xiàng)添加到pom.xml :

junit junit 4.8.1 test org.jboss.arquillianarquillian-junit${arquillian.version}testorg.jboss.arquillian.containerarquillian-glassfish-remote-3.1${arquillian.version}testjavax.enterprisecdi-api1.0-SP4test

第一個(gè)依賴項(xiàng)是您的JUnit框架來編寫集成測試。 第二個(gè)依賴項(xiàng)將Arquillian與JUnit集成在一起。 第三個(gè)依賴項(xiàng)集成了您的部署容器。 對我來說,這是我的Glassfish安裝。 最后一個(gè)依賴項(xiàng)是CDI API,該CDI API需要可用于CDI測試。

請注意,在第17行中,我將我的Glassfish 3.1安裝用作部署容器,而Arquillian使用遠(yuǎn)程調(diào)用來執(zhí)行測試。 您需要在此處配置自己的部署環(huán)境。 有關(guān)正確的artifactId值,請參見JBoss Maven Repo 。 使用Arquillian,您的目標(biāo)環(huán)境也可以是嵌入式容器,例如JBoss Embedded AS,GlassFish Embedded或Weld SE。 在那種情況下,您不需要單獨(dú)的容器安裝和遠(yuǎn)程調(diào)用,它們都在本地運(yùn)行(“內(nèi)存中”)。

在為目標(biāo)環(huán)境添加依賴項(xiàng)之后,您可以執(zhí)行mvn eclipse:eclipse。

使用Arquillian和JUnit編寫和執(zhí)行測試

最后,我編寫了我的第一個(gè)Arquillian集成測試類:

import javax.inject.Inject;import junit.framework.Assert;import org.jboss.arquillian.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Test; import org.junit.runner.RunWith;import com.mycompany.jeeapp.scope.MyApplicationService; import com.mycompany.jeeapp.scope.MyConversationService; import com.mycompany.jeeapp.scope.MyDefaultService; import com.mycompany.jeeapp.scope.MyRequestService; import com.mycompany.jeeapp.scope.MyScopeBean; import com.mycompany.jeeapp.scope.MySessionService; import com.mycompany.jeeapp.scope.MySingletonService; import com.mycompany.jeeapp.scope.extension.MyCustomScopeService;@RunWith(Arquillian.class) public class MyArquillianJUnitTest {@Injectprivate MyScopeBean myScopeBean;@Deploymentpublic static JavaArchive createTestArchive() {return ShrinkWrap.create(JavaArchive.class, "test.jar").addClasses(MyScopeBean.class,MyApplicationService.class,MyConversationService.class, MyDefaultService.class,MyRequestService.class, MySessionService.class,MySingletonService.class, MyCustomScopeService.class).addAsManifestResource(EmptyAsset.INSTANCE,ArchivePaths.create("beans.xml"));}@Testpublic void testScopedBeans() {Assert.assertTrue(myScopeBean.getApplicationService().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getApplicationServiceWithNew().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getCustomScopeService().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getDefaultService().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getRequestService().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getSessionService().getSomeName().equals("myName"));Assert.assertTrue(myScopeBean.getSingletonService().getSomeName().equals("myName"));}}

結(jié)論

Spring目前不為作用域bean提供集成測試支持。 令人驚訝的是,Spring一直非常重視所有測試主題。 我在博客中描述了一種解決方法。 完成這項(xiàng)工作并不難。 計(jì)劃對3.2 M1版本提供完全集成測試支持。

Arquillian啟用了CDI范圍的bean測試。 我在設(shè)置過程中遇到了一些問題(請參閱下面的最后一段),如果您使用新技術(shù),我認(rèn)為這很常見。 您必須將所有測試中的bean傳遞到歸檔文件(請參閱@Deployment方法)這一事實(shí)是我需要在大型項(xiàng)目中嘗試的:這真的是一個(gè)好主意嗎? 有時(shí),大型應(yīng)用程序與來自不同程序包的數(shù)十個(gè)bean連接在一起。 很難預(yù)測在集成測試中使用了哪些bean。

問題與解決方案

一些Arquillian設(shè)置帶有很多依賴項(xiàng),以致您不能使用標(biāo)準(zhǔn)的Eclipse啟動(dòng)配置。 生成的命令行參數(shù)超出了Windows命令行指令的長度限制。 因此,我已使用Ant腳本開始測試。 該腳本僅用于說明。 您必須構(gòu)建自己的Ant腳本。 您可以按照以下方式獲取類路徑信息:在Eclipse中,轉(zhuǎn)到“文件>導(dǎo)出>常規(guī)> Ant構(gòu)建文件”以生成您的類路徑信息。 獲取此類路徑信息,并將其放入Ant JUnit測試啟動(dòng)腳本中。 我已經(jīng)在這里記錄了完整的Ant腳本 。

當(dāng)我啟動(dòng)此Ant腳本時(shí),一切對我來說都很好。 如果您有任何問題要告訴我,可以查看測試結(jié)果文件和server.log進(jìn)行分析。

Arquillian設(shè)置期間出現(xiàn)更多錯(cuò)誤消息

WELD-001303范圍類型javax.enterprise.context.ConversationScoped沒有活動(dòng)上下文

-> ConversationScope通過EE規(guī)范綁定到JSF。 因此,在Arquillian背負(fù)的正常HTTP請求期間,它們將不會(huì)處于活動(dòng)狀態(tài)。

POST http:// localhost:4848 / management / domain / applications / application返回的響應(yīng)狀態(tài)為403

-> 404/403錯(cuò)誤可能是部署問題,請檢查server.log的根本原因(我是沒有將所有必需的類添加到test.jar )

執(zhí)行命令行時(shí)發(fā)生異常。

無法運(yùn)行程序“ D:\ dev_home \ java-6-26 \ bin \ javaw.exe”(在目錄“ D:\ dev_home \ repositories \ git \ jee-app-weld \ jee-app-weld”中):CreateProcess錯(cuò)誤= 87,Falscher參數(shù)

->類路徑超出Windows命令行操作允許的長度。 您需要使用Ant腳本或Maven來運(yùn)行測試。

ValidationException:DeploymentScenario包含未在注冊表中緩存任何已定義容器的目標(biāo)

->看到這里 。

WELD-000072聲明鈍化作用域的托管bean必須具有鈍化能力。 Bean:具有限定符[@Any @Default]的托管Bean [com.mycompany.jeeapp.scope.example.UserCredentials類]

->您需要在會(huì)話和會(huì)話范圍的bean上實(shí)現(xiàn)Serializable。

DeploymentScenario包含不在注冊表中緩存任何定義的Container的目標(biāo)。 _默認(rèn)_

->看到這里 。

java.net.ConnectException:連接被拒絕:connect

->您的遠(yuǎn)程Java EE服務(wù)器安裝未運(yùn)行,請啟動(dòng)它!

參考:來自我們JCG合作伙伴 Niklas的“在CDI 1.0和Spring 3.1中對作用域Bean進(jìn)行集成測試”。


翻譯自: https://www.javacodegeeks.com/2012/01/integration-testing-scoped-beans-in-cdi.html

總結(jié)

以上是生活随笔為你收集整理的集成测试CDI 1.0和Spring 3.1中的作用域bean的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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