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

cdi 2.7.5

在这篇博客文章中,我描述了如何在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包含的目标未在注册表中缓存任何已定义的Container

->看到这里 。

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

cdi 2.7.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作流编写教程

介绍 ONES中使用了flowchart.js作为前端展示,并且扩展了flowchart.js的流程描述语言。flowchart.js 参见: https://github.com/adrai/flowchart.js 描述语言分为三部分,使用\n\n(空一行)作为分割,分别是节点定义、执行流程描述、节…

elementui设置表头与表格(左对齐,背景颜色,字体大小等)

headerStyle控制表头&#xff0c;finalCellStyle控制表格 html <div class"table1"><el-tablesize"mini":data"tableDataLeft"borderstripe:default-sort"defaultSort":max-height"tableMaxH":header-cell-style&…

使用LocalTestServer对HTTP调用进行单元测试

有时候&#xff0c;当您正在对远程服务器进行HTTP调用的单元测试代码时。 您可能正在使用诸如ApachesHttpClient或Spring的RestTemplate之类的库。 当然&#xff0c;您不想依靠远程服务进行单元测试。 除了涉及的开销&#xff08;记住单元测试应该是快速的&#xff09;之外&am…

PHP header函数大全

PHP header函数大全 header(Content-Type: text/html; charsetutf-8); header(Location: http://www.php-note.com/); <?php // fix 404 pages: header(HTTP/1.1 200 OK);// set 404 header: header(HTTP/1.1 404 Not Found);// set Moved Permanently header (good for re…

JS提升(hoisting)

近期在学习js&#xff0c;了解到js的一个名词&#xff0c;就是hoisting&#xff0c;进而了解了下js的解析机制 详情可参考&#xff1a;http://www.runoob.com/js/js-hoisting.html js的解析过程分为两个阶段&#xff1a;编译阶段和执行阶段 编译阶段&#xff1a;即我们常说的…

【Java从入门到天黑|01】SE入门之Java的前生今世

大家好,我是孙叫兽,微信公众号【孙叫兽杂谈】,本期给大家分享一下JavaSE的入门部分之Java的前生今世。 Java : 一个帝国的诞生 C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。 1972年, 随着C语言的诞生和Unix的问世, 帝国

前端-html、css

HTML一、html简介超级文本标记语言是标准通用标记语言下的一个应用&#xff0c;也是一种规范&#xff0c;一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff0c;可以告诉浏览器如…

在Java EE组件中使用骆驼路线

从现在开始我一直在与Camel合作&#xff0c;我真的很喜欢它的简单性。 在Java EE之上始终使用它一直是一个挑战&#xff0c;而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上建议使用WildFly-Camel Subsystem 。 在正在进行的系列文章中&…

【Java从入门到天黑|02】SE入门之Java基础

大家好,我是孙叫兽,微信公众号【孙叫兽杂谈】,本期给大家分享一下JavaSE的入门部分之Java基础 目录 注释 标识符 数据类型 类型转换 变量,常量 运算符

webpack入门

遇到问题首先到github项目的Issues中&#xff0c;检索一下相关问题&#xff0c;比在百度谷歌上直接搜索非官方解决方案好得多。 1、npm init 生成 package.json 2、npm i -D webpack 生成 # npm i -D 是 npm install --save-dev 的简写&#xff0c;是指安装模块并保存到 packa…

接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架

基于pythonTestlinkJenkins实现的接口自动化测试框架 by:授客 QQ&#xff1a;1033553122 博客&#xff1a;http://blog.sina.com.cn/ishouke 欢迎加入软件性能测试交流QQ群&#xff1a;7156436 目录 1、 开发环境... 1 2、 主要功能逻辑介绍... 1 3、 框架…

PC钉钉无法输入汉字的解决办法

问题描述 新公司办公OA使用的钉钉&#xff0c;今天想给设计师发消息呢&#xff0c;发现私活输入不了汉字&#xff0c;早上还行呢&#xff0c; 过程尝试 在百度中可以输入汉字&#xff0c;在钉钉中不行。 解决办法 退出钉钉&#xff0c;重新进入&#xff0c;可以输入汉字了。如果…

this的指向

箭头函数&#xff1a;定义时所在的作用域&#xff08;tip:继承而来 函数作用域 &#xff09; 普通函数&#xff1a;指向调用它的对象 箭头函数体内的 this对象&#xff0c;就是定义时所在的对象&#xff0c;而不是使用时所在的对象 1、箭头函数没有自己的this&#xff0c;ar…

事关每个程序员的职业规划与履历

今天&#xff0c;甚至过去&#xff0c;大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程&#xff0c;还是已经奋斗多年&#xff0c;以下内容都会对您的职业生涯有所助益。 目录 几条重要的职业规划提示。 1. 学习的步伐不停止 2. 学会问、学会听&#xff0c;学会学习…

iOS--viewController

隐藏状态栏 1 -(BOOL)prefersStatusBarHidden{ 2 return YES; 3 } 转载于:https://www.cnblogs.com/chebaodaren/p/5367160.html

jsf 开发_JSF开发人员应该知道的5种有用方法

jsf 开发这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。 必须按faces-config.xml或注释注册该bean。 注入是好的&a…

程序员应该如何规划自己的人生与书写履历?

今天,甚至过去,大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程,还是已经奋斗多年,以下内容都会对您的职业生涯有所助益。几条重要的职业规划提示。1. 学习的步伐不停止 古人说,活到老,学到老。终身学习应该是您的座右铭。 世界在不断变化,每个人都在寻找各…

浅谈多线程——NSThread

上一篇文章中我们大致了解了GCD的模式和方法&#xff0c;在iOS开发中除了GCD之外&#xff0c;还有NSThread和NSOperation两种多线程方式。 1.NSThread - a - 使用NSThread开辟多线程进行子任务处理&#xff1a;类方法和初始化方法 使用类方法不需要创建对象就可以直接开辟多线程…

小程序思考与回答

1.全局scss $:考虑引入 4.import url 引入css 的区别 5.uniapp 中不需要scope 页面样式也不会相互影响&#xff1f; 6.文件上传 oss? 二、引入qs这个库&#xff0c;更好的处理网络请求传参。 三、图片文件转为base64 好处&#xff1a; 1、减少了下载图片的http请求数&#x…

2021年程序员可以做哪些副业?

哈喽&#xff0c;大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享程序员搞副业的一期节目&#xff0c;欢迎大家一起学习。 1.程序员为什么要做副业&#xff1f; 副业意味着自由 时至今日&#xff0c;仍然有一大群程序员还天真地认为从事副业是一种压迫。但事实是&…