集成测试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.mzph.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;…