测试Spring的“会话”范围

在基于Spring的Web应用程序中,bean的作用域可以是用户“会话”。 从本质上讲,这意味着对会话范围的Bean的状态更改仅在用户会话范围内可见。

此项的目的是简单地突出显示Spring Test MVC提供的一种方法,以测试将会话范围的bean作为依赖项的组件。

考虑一下UserPreferences类的Spring参考文档中的示例,其中包含用户的timeZoneId:

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class UserPreferences {private String timeZoneId="default";public String getTimeZoneId() {return timeZoneId;}public void setTimeZoneId(String timeZoneId) {this.timeZoneId = timeZoneId;}
}

在这里,范围被标记为“会话”,并且proxyMode被明确指定为TARGET_CLASS,以指示Spring创建CGLIB代理(因为UserPreferences不实现任何其他接口)。

现在考虑使用此会话范围的bean作为依赖项的控制器:

@Controller
public class HomeController {@Autowired private UserPreferences userPreferences;@RequestMapping(value="/setuserprefs")public String setUserPrefs(@RequestParam("timeZoneId") String timeZoneId, Model model) {userPreferences.setTimeZoneId(timeZoneId);model.addAttribute("timeZone", userPreferences.getTimeZoneId());return "preferences";}@RequestMapping(value="/gotopage")public String goToPage(@RequestParam("page") String page, Model model) {model.addAttribute("timeZone", userPreferences.getTimeZoneId());return page;}
}

这里有两种控制器方法,在第一种方法中,设置用户偏好,在第二种方法中,读取用户偏好。 如果会话作用域的bean运行正常,则在用户会话中对“ / setuserprefs”的调用应在UserPreferences bean中设置timeZoneId首选项,而在同一会话中的另一个调用“ / gotopage”应成功检索先前设置的首选项。

使用现在与Spring-test模块打包在一起的Spring MVC测试支持,对此进行测试很简单。

测试看起来像这样:

首先使用Spring Java Configuration进行测试的bean定义:

@Configuration
@EnableWebMvc
@ComponentScan({"scope.model","scope.services", "scope.web"})
public class ScopeConfiguration {}

和测试:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ScopeConfiguration.class)
@WebAppConfiguration
public class ScopeConfigurationTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setup() {this.mockMvc = webAppContextSetup(this.wac).build();}@Testpublic void testSessionScope() throws Exception {MockHttpSession mocksession = new MockHttpSession();this.mockMvc.perform(get("/setuserprefs?timeZoneId={timeZoneId}", "US/Pacific").session(mocksession)).andExpect(model().attribute("timeZone", "US/Pacific"));this.mockMvc.perform(get("/gotopage?page={page}", "home").session(mocksession)).andExpect(model().attribute("timeZone", "US/Pacific"));this.mockMvc.perform(get("/gotopage?page={page}", "home").session(new MockHttpSession())).andExpect(model().attribute("timeZone", "default"));}
}

在测试中,首先创建一个MockHttpSession来模拟用户会话。 随后的两个请求是在此模拟会话的上下文中发出的,因此期望在测试中声明的控制器中可以看到相同的UserPreferences bean。 在第三个请求中,创建了一个新会话,这次是在控制器中看到另一个UserPreferences bean,这是通过查找其他属性来断言的。

这演示了使用Spring测试MVC支持来测试会话范围的bean的干净方法。

参考: all和其他博客中的JCG合作伙伴 Biju Kunjummen 测试了Spring的“会话”范围 。

翻译自: https://www.javacodegeeks.com/2013/06/testing-spring-session-scope.html

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

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

相关文章

Sass学习之路(3)——Sass编译

Sass的编译也是在我们使用Sass的时候必须要经过的一个步骤&#xff0c;因为".sass"和".scss"文件并不能直接使用<link>标签引用&#xff0c;最终其实还是要将他们转换成CSS文件来在项目中使用。 所以要让web页面真正使用到Sass缩写的东西&#xff0…

爬虫练习一(爬取笑话集)

爬取笑话集网页 目标网址为&#xff1a;http://www.jokeji.cn/list.html 感觉这个网站挺简单&#xff0c;不用登陆&#xff0c;没有复杂的功能&#xff0c;好爬~ 可以现在浏览器中访问这个链接看一下效果&#xff0c;你会发现这个页面是个目录&#xff0c;有很多笑话页面的链接…

Huffman树学习

一篇很好的博客 转载于:https://www.cnblogs.com/cjoierljl/p/9319902.html

JAVA第六章第6题,java第六章例题源代码

《JavaWeb 程序设计》 练习题参考答案 第一章:Servlet 基础 1、下列选项中属于...由于 PHP 开放源 代码,并且是免费的,所以非常流行,是当今 Internet 上最为火热......JAVA 编程实例大全及详解答案(50 例) 【程序 1】题目:古典问题:有一对...9、Java 中一个字符占用两个 字节,所…

GlassFish 4带来了Java EE 7

真是惊喜 除了推出新的iOS 7外&#xff0c;苹果在wwdc上什么也没提供。 碰巧的是&#xff0c;在他们的主题演讲后不久&#xff0c;又有7个人正式露面。 GlassFish 4.0已于昨天晚上发布&#xff08;显然是不需要的&#xff09;。 新的Java EE 7参考实现自动成为当今第一个可用的…

bootstrap的栅格布局与两列布局结合使用

在工作中我们常常需要实现响应式布局&#xff0c;这个可以使用bootstrap的栅格系统来实现&#xff0c;我们在列里也需要实现一部分的响应式。比如下面的效果图&#xff0c;需要实现左边图标固定&#xff0c;右边的自适应 &#xff1a; 左边固定宽度&#xff0c;右边自适应&…

软件测试初学记录——第一章

阅读软件测试记要 什么是软件测试&#xff1a; 以找出软件中不符合需求而去操作软件的过程称为软件测试。 软件测试员的工作&#xff1a; 软件测试员的目标是尽早的发现软件缺陷&#xff0c;并确保其被修复。 软件缺陷是什么&#xff1a; 不符合需求文档或导致软件不能正常运行…

matlab命令 脑电波,基于Matlab的脑电波信号处理

做脑电波信号处理滴嘿嘿。。Matlab addictedCodes%FEATURE EXTRACTERfunction [features] EEGfeaturetrainmod(filename,m)a 4;b 7;d 12;e 30;signals 0;for index 1:9; % read in the first ten EEG data because the files are numbered as ha11test01 rather than ha…

JavaScript内置对象Date常用函数

// //获取当前时间// var dt new Date();// alert(dt);// //传入时间// var dt1 new Date("2017-08-12");// alert(dt1);//// //获取时间的对象(毫秒)// var dt2 Date.now();// alert(dt2);//// …

JVM性能魔术技巧

HotSpot是我们众所周知和喜爱的JVM&#xff0c;是Java和Scala汁流淌的大脑。 多年来&#xff0c;许多工程师对其进行了改进和调整&#xff0c;并且在每次迭代中&#xff0c;其代码执行的速度和效率都接近本机编译代码。 JIT&#xff08;“即时”&#xff09;编译器是其核心。…

移动端1px

移动端不同尺寸设备dpi不同&#xff0c;会造成1px线条不同程度的缩放&#xff0c;可利用媒体查询device-pixel-ratio&#xff0c;进行不同情况匹配&#xff1a; media&#xff08;-webkit-min-device-pixel-ratio:1.5&#xff09;,(min-device-pixel-ratio:1.5){//dpi:1.5 .bo…

mysql 10个日期,MySQL自学篇(10)——日期函数

MySQL自学篇(十)——日期函数日期和时间函数(1)获取当前日期的函数和时间的函数CURDATE()和CURRENT_DATE()函数&#xff0c;获取当前日期select current_date(),curdate(),curdate()0;curdate()0 表示将当前时间转化为数值型CURTIME()和CURRENT_TIME()获取当前时间select cur…

python-flask-请求源码流程

启动先执行manage.py 中的 app.run() class Flask(_PackageBoundObject):   def run(self, hostNone, portNone, debugNone, **options):from werkzeug.serving import run_simpletry:#run_simple 是werkzeug 提供的方法&#xff0c;会执行第三个参数 self()run_simple(ho…

正则表达式强化,爬虫练习

re模块下的常用方法 import re ret re.findall(\d(\.\d)?, 1.232.34)   print(ret) 结果&#xff1a; [.23,.34] # findall的正则表达式里面有分组(),()里面的内容优先显示 ret re.findall(\d(?:\.\d)?, 1.232.34)print(ret)    结果&#xff1a;…

Java垃圾回收(3)

这是我之前的两个垃圾收集博客文章中的内容&#xff1a; 热点GC概述 。 并行垃圾收集器 。 并发标记扫描 Hotspot中的并行垃圾收集器旨在最大程度地减少应用程序进行垃圾收集所花费的时间&#xff0c;这称为吞吐量 。 对于所有应用程序来说&#xff0c;这并不是一个适当的权…

display转块状化

display:block block元素会独占一行&#xff0c;多个block元素会各自新起一行。默认情况下&#xff0c;block元素宽度自动填满其父元素宽度。 block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。 block元素可以设置margin和padding属性。 display:in…

php论坛思路,PHP论坛实现积分系统的思路代码详解

PHP论坛实现积分系统的思路代码详解,积分,头像,等级,用户,字段PHP论坛实现积分系统的思路代码详解易采站长站&#xff0c;站长之家为您整理了PHP论坛实现积分系统的思路代码详解的相关内容。首先在用户表定义一个积分字段&#xff1b;然后创建一个等级表&#xff0c;主要字段有…

Spring MVC:会话高级

不久前&#xff0c;我写了一篇关于Spring MVC应用程序中HTTP会话的文章。 那是简单的文章&#xff0c;着重于用法的实际方面。 在文章的最后&#xff0c;我保证会写一些更高级的主题&#xff0c;专门针对Spring MVC应用程序中的会话。 因此&#xff0c;我将发布这些东西。 在开…

Linux LVM管理

LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对磁盘分区进行管理的一种机制。 本文内容&#xff1a; 创建和管理LVM扩容LVM分区一、创建和管理LVM 要创建一个LVM系统&#xff0c;一般需要经过以下步骤&#xff1a; 1、 创建…

USB OTG插入检测识别

一 USB引脚一般四根线&#xff0c;定义如下&#xff1a; 为支持OTG功能&#xff0c;mini/micro usb接口扩展了一个ID引脚&#xff08;第4脚&#xff09; A设备端ID脚接地&#xff0c;则初始状态为Host&#xff0c;例如PC和支持OTG设备做主设备时 B设备端ID脚悬空&#xff0c;默…