集成測試CDI 1.0和Spring 3.1中的作用域bean

在這篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean進行集成測試。 一切都用小代碼示例進行說明。 使用范圍進行集成測試并不是特別容易。 想象一下存在于會話范圍內的bean,例如UserCredentials 。 在集成測試中,通常沒有HttpRequest或HttpSession可以使用(至少在不進行包含用戶界面的測試時)。 因此,您需要一些基礎架構來進行集成測試。 使用這兩種技術,使此基礎結構正常運行有點令人困惑。 獲取您自己的照片。

如果您不熟悉CDI和Spring中的范圍和上下文,請查看基礎知識并獲得有關不同范圍的概述。

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

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

首先,您需要為測試開發一個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中將該類注冊為會話范圍管理對象,請執行以下操作:

注意,我在context:component-scan標記之后注冊了作用域

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

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

注意,我已經在作用域bean上調用了方法getName() 。 這對于確保范圍確定有效。 客戶端代理可能會在注入點被注入,但是如果您對代理進行調用,則它不會分別引用作用域對象和協作對象。

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

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

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

pom.xml文件的更改

這些示例假定您有一個Java EE項目正在運行,您還可以在此處查看如何設置新的Java EE 6項目。 要集成Arquillian,請對pom.xml文件進行以下更改:

在屬性部分:

1.0.0.Alpha5

添加此存儲庫:

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

這是官方的JBoss Maven存儲庫,所有Arquillian發行版都在其中。

將以下依賴項添加到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

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

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

在為目標環境添加依賴項之后,您可以執行mvn eclipse:eclipse。

使用Arquillian和JUnit編寫和執行測試

最后,我編寫了我的第一個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"));}}

結論

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

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

問題與解決方案

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

當我啟動此Ant腳本時,一切對我來說都很好。 如果您有任何問題要告訴我,可以查看測試結果文件和server.log進行分析。

Arquillian設置期間出現更多錯誤消息

WELD-001303范圍類型javax.enterprise.context.ConversationScoped沒有活動上下文

-> ConversationScope通過EE規范綁定到JSF。 因此,在Arquillian背負的正常HTTP請求期間,它們將不會處于活動狀態。

POST http:// localhost:4848 / management / domain / applications / application返回的響應狀態為403

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

執行命令行時發生異常。

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

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

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

->看到這里 。

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

->您需要在會話和會話范圍的bean上實現Serializable。

DeploymentScenario包含不在注冊表中緩存任何定義的Container的目標。 _默認_

->看到這里 。

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

->您的遠程Java EE服務器安裝未運行,請啟動它!

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


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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript學習隨記——數組一

數組的創建及length屬性 <script type"text/javascript" charset"utf-8">// 數組創建方式一,此種方式寫的時候比較麻煩var arrnew Array();// 數組創建方式二var arr [1,2,3,4,true,str,new Date()];console.log("arr.length&#xff1a;"…

USACO milk4 枚舉答案再檢驗

剛開始寫了一個暴力的dfs超時了&#xff0c; 最后看了下題解說是先枚舉答案再判斷&#xff0c;然后就寫了雙dfs&#xff0c;全部秒殺&#xff0c;代碼如下&#xff1a; /*ID: m1500293LANG: CPROG: milk4 */ #include <cstdio> #include <cstring> #include <al…

微信小程序常見問題集合(長期更新)

最新更新&#xff1a; 新手跳坑系列&#xff1a;推薦閱讀&#xff1a;《二十四》request:fail錯誤&#xff08;含https解決方案&#xff09;&#xff08;真機預覽問題 跳坑指南《七十》如何讓微信小程序服務類目審核通過跳坑六十九&#xff1a;uploadFile:fail Error: unable t…

mysql指令按順序排列_mysql基本語法大全

1.備份數據庫&#xff1a;1.1備份數據庫中的表:mysqldump -u root -p test a b >d:\bank_a.sql//分別備份數據庫test下a和b表1.2備份一個數據庫mysqldump -u root -p test > d:\testbk.sql1.3備份多個數據庫mysqldump -u root -p --databases test mysql > D:\data.sq…

Spring和石英:多作業計劃服務

作業調度對于應用程序來說是如此重要。 尤其是在大型項目中&#xff0c;處理大量工作可能是一個問題。 Spring和Quartz為解決該問題帶來了巨大的好處。 本文介紹了如何通過使用Spring和Quartz輕松地計劃多個作業。 二手技術&#xff1a; JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

JavaScript學習隨記——數組二

數組indexOf(arg) 和 lastIndexOf(arg)方法使用 <script type"text/javascript" charset"utf-8">/*** indexOf(arg):返回指定參數在數組中的索引位置&#xff08;從前往后查&#xff0c;比較是使用 ‘’&#xff0c;查詢到立即返回索引位置&#xff…

反射的簡單應用

首先有一個類 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace ConsoleApplication18 {9 public class demo 10 { 11 public string name "程序員"; 12…

JavaFX 2.0示例介紹書

我最近完成了有關JavaFX 2.0 SDK新版本的書的編寫&#xff0c;并且已經將它放在您附近的書店&#xff08; Amazon &#xff09;的書架上。 該書將逐步指導您完成JavaFX 2.0的來龍去脈。 當您遇到一章時&#xff0c;將看到一些菜譜&#xff0c;這些菜譜將帶來一個問題&#xff0…

雙縱坐標的繪圖命令_工程師繪圖必備軟件——OriginLab 2019b

點擊右上角關注&#xff0c;盡享后續精品軟件OriginLab 2019b是OriginLab OriginPro 2019版本的加強版&#xff0c;這個軟件對于許多人來講并不陌生&#xff0c;可以說是科學家和工程師的繪圖必備軟件。新的版本也帶來許多改變&#xff0c;軟件擁有多種功能&#xff0c;這個版本…

JavaScript學習隨記——對象

JS中對象基本使用 <script type"application/javascript" charset"utf-8">//Objcet 所有類的基礎類/*** 創建對象方式一*/ // var objnew Objcet();/** 創建對象方式二,注意 {}不可忘記寫* */var obj {};obj.name "什碼情況";obj.age …

[轉]Java_List元素的遍歷和刪除

原文地址:http://blog.csdn.net/insistgogo/article/details/19619645 1、創建一個ArrayList [java] view plainList<Integer> list new ArrayList<Integer>(); 2、List常用的遍歷方法有三種&#xff1a; &#xff08;1&#xff09;下標循環 [java] view plainfo…

分層設計 --java中的幾種包

對于剛接觸包分層的同學&#xff0c;下面簡單介紹一下java中各個層次&#xff1a; Modle 模型層 &#xff1a;存放你的實體類 dao&#xff1a;主要做數據庫的交互工作&#xff0c;具體的增刪改查等方法&#xff0c;操作數據庫的&#xff1b;這里也可以存放查詢所有的信息接口 …

Spring遠程支持和開發RMI服務

Spring遠程支持簡化了啟用遠程服務的開發。 當前&#xff0c;Spring支持以下遠程技術&#xff1a;遠程方法調用&#xff08;RMI&#xff09;&#xff0c;HTTP調用程序&#xff0c;Hessian&#xff0c;Burlap&#xff0c;JAX-RPC&#xff0c;JAX-WS和JMS。 遠程方法調用&#xf…

cesium繪制網格_Cesium學習筆記-工具篇37-風場繪制

這兩天重新接觸到流場&#xff0c;于是研究下&#xff0c;在大牛們的輪子上也算實現了效果&#xff1a;1二維2三維主要參考以下三篇文章&#xff1a;《WebGL風向圖》給出制作風向圖通常步驟&#xff1a;1. 在屏幕上生成一系列隨機粒子位置并繪制粒子。2. 對于每一個粒子&#x…

ToString:身份哈希碼的十六進制表示形式

我以前在方便的Apache Commons ToStringBuilder上寫過博客&#xff0c;最近有人問我&#xff0c;在生成的String輸出中出現的看似神秘的文本是什么構成的。 詢問該問題的同事正確地推測出他正在查看的是哈希碼&#xff0c;但與他實例的哈希碼不匹配。 我解釋說ToStringBuilder將…

HTML+CSS筆記 CSS中級 縮寫入門

盒子模型代碼簡寫回憶盒模型時外邊距(margin)、內邊距(padding)和邊框(border)設置上下左右四個方向的邊距是按照順時針方向設置的&#xff1a;上右下左。語法:margin:10px 15px 12px 14px;/*上設置為10px、右設置為15px、下設置為12px、左設置為14px*/通常有三種縮寫的方法:1、…

JavaScript學習隨記——常見全局對象屬性及方法

<script type"text/javascript" charset"utf-8">//全局對象&#xff1a; Object、Array、Math等/*** 全局的方法&#xff1a;* 1.encodeURI、escape、decodeURIComponet 編碼* 2.decodeURI、unescape、encodeURIComponet 解碼* 3.parseInt、parseF…

spring boot 定時任務

package com.ict.conf; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled;Configuration EnableScheduling // 啟用定時任務 …

搬運機器人舉杯賀所需的條件_智能搬運機器人比賽規則

附件4&#xff1a;分揀機器人(智能搬運機器人)比賽規則1、比賽目的設計一個輪式或人形小型機器人&#xff0c;在比賽場地里移動&#xff0c;將不同顏色、形狀或者材質的物體分類搬運到不同的對應位置。比賽的記分根據機器人將物體放置的位置精度和完成時間來決定分值的高低。它…

我們多么想要新的Java日期/時間API?

當前的Java.net 民意測驗問題是&#xff1a;“ 對于用Java 8實現的JSR-310&#xff08;新的日期和時間API&#xff09;有多重要&#xff1f; ”在我撰寫本文時&#xff0c;將近150位受訪者投了贊成票&#xff0c;絕大多數人回答“非常”&#xff08;53&#xff05;&#xff09;…