在基于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

测试Spring的“会话”范围相关推荐

  1. spring 事务 会话_测试Spring的“会话”范围

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

  2. 使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)

    在上一篇文章中 ,我写了关于如何使用Arquillian Cube和 Docker一起测试Spring Data应用程序的信息. 测试看起来像: @RunWith(SpringRunner.class ...

  3. junit 测试 dao_JUnit测试Spring Service和DAO(带有内存数据库)

    junit 测试 dao 这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试. 它建立在Spring MVC-Service-DAO-Pers ...

  4. 使用Mockito测试Spring组件

    我认为,能够对弹簧组件进行单元测试而无需使用临时测试配置加载完整的弹簧上下文,这是一个很大的优势,因为它干净,易于维护,编写速度更快,更改平滑. 实现此目标的一种方法是使用Mockito并告诉他用Mo ...

  5. Spring MVC会话教程

    会话管理是每个Web应用程序必不可少的部分. 由于Spring MVC是用于Web开发的功能强大的框架,因此它具有自己的工具和API与会话进行交互. 今天,我打算向您展示Spring MVC应用程序中 ...

  6. REST + Spring Security会话问题

    REST , 会话 ..等待. REST应用程序中没有会话,对吗? 好吧,那是真的. 如果我们可以避免会议,我们应该这样做. REST是无状态的 . 有关无状态性的主要问题是身份验证. 在通常的Web ...

  7. 消费者驱动的契约测试 Spring Cloud Contract介绍

    消费者驱动的契约测试 Spring Cloud Contract介绍 什么是契约测试 测试是软件流程中非常重要,不可或缺的一个环节.一般的测试分为单元测试,集成测试,端到端的手工测试,这也是构成测试金 ...

  8. (转)编写Spring的第一个案例并测试Spring的开发环境

    http://blog.csdn.net/yerenyuan_pku/article/details/52832145 Spring4.2.5的开发环境搭建好了之后,我们来编写Spring的第一个案例 ...

  9. Spring第二弹—–搭建与测试Spring的开发环境

    PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...

最新文章

  1. 给字母保密的c语言,C语言练习题
  2. Yii实现分页的两种方法
  3. CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表
  4. 阿里云发布OAMKubernetes标准实现与核心依赖库
  5. 一个特牛的日期时间判断正则表达式
  6. 190107每日一句
  7. Atitit 项目文档规范化与必备文档与推荐文档列表
  8. RS232协议和RS485协议有什么不同?
  9. 【扫码登录的逻辑以及关于扫码登录的思考】
  10. ORACLE对字符串去空格处理(trim)
  11. HTML 页面 meta 的作用
  12. 淘宝付邮试用Chrome桌面提醒插件(含源码)
  13. springmvc中使用forward和redirect
  14. 100个RPA经典应用场景解析
  15. 【雕刻机】Grbl程序使用入门
  16. 盘点各大互联网公司不同职级薪资情况,阿里、腾讯、字节......哪家强
  17. 关联性图注意力网络:Relational Graph Attention Networks(ICLR2019)
  18. 基于Android实现的OA办公自动化系统
  19. 《生于忧患,死于安乐》
  20. PLC(一)可编程控制器基础

热门文章

  1. ios签名软件_苹果企业签名常常掉怎样处理【苹果签名吧】
  2. java使用迭代器删除元素_使用Java从地图中删除元素
  3. xml不利于调试_流利的接口不利于维护
  4. 私有方法与静态私有方法_每个私有静态方法都是新类的候选人
  5. java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性
  6. 春春幼儿园堆积木大赛_春云边车
  7. netflix_学习Netflix管理员–第1部分
  8. 注解默认继承_默认方法和多重继承
  9. java 拼图_我最喜欢的Java拼图2 + 1 = 4
  10. neo4j 嵌入式_在嵌入式Neo4j中使用Neo4j浏览器