java中怎样测试webwervice_junit4单元测试--web项目中模拟登录会话,做全流程测试...

2023-10-30

junit4相对于junit3,基于注解的方式写单元测试用例,使用过程中方便很多。如下缩写均是代码片段,摘录其中关键部分,重要是理解其中知识点。

一、编写测试用例基类

@RunWith(SpringJUnit4ClassRunner.class)

@WebAppConfiguration

@ContextConfiguration({"file:src/main/webapp/WEB-INF/applicationContext.xml", "file:src/main/webapp/WEB-INF/spring-servlet.xml","file:src/main/webapp/WEB-INF/conf/spring-redis.xml", "file:src/main/webapp/WEB-INF/conf/spring-resttemplate.xml"})public abstract classBaseJunit

{/*** wac*/@AutowiredprivateWebApplicationContext wac;/*** MockMvc*/

privateMockMvc mockMvc;protectedWebApplicationContext getWac()

{return this.wac;

}protectedMockMvc getMockMvc()

{return this.mockMvc;

}/*** 初始化mocMvc

*

*@see

*/@Beforepublic voidsetUp()

{this.mockMvc = webAppContextSetup(this.wac).build();

}

......

}

@RunWith(SpringJUnit4ClassRunner.class) 指定采用Spring的运行环境

@WebAppConfiguration 用来声明这是一个web测试环境

@ContextConfiguration 用来指定加载项目的配置文件

二、抽出web系统登录方法

public abstract class BaseLoginJunit extendsBaseJunit

{/*** MockMvc*/

privateMockHttpSession session;protectedMockHttpSession getSession()

{returnsession;

}/*** 测试前,初始化系统登录

*

*@see

*/@Beforepublic voidsetUp()

{super.setUp();this.session =(MockHttpSession)getLoginSession();

}/*** 完成登录功能,返回当前登录会话

*

*@returnHttpSession

*@see

*/

privateHttpSession getLoginSession()

{

String url= "/xxx/login";

String params= "{\"userName\":\"xxx\",\"password\":\"xxx\",\"verifyCode\":\"xxx\"}";

MvcResult result= null;try{

result=getMockMvc().perform(

MockMvcRequestBuilders.post(url).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_UTF8_VALUE).content(

params)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();

}catch(Exception e)

{

e.printStackTrace();

}returnresult.getRequest().getSession();

}

......

}

三、编写spring控制器测试方法

@FixMethodOrder(MethodSorters.NAME_ASCENDING) //指定按字母顺序执行测试用例

public class ResourceControllerTest extendsBaseLoginJunit

{/*** res id list*/

private static List RES_LIST = new ArrayList<>();/*** 测试 getResource

*

*@see

*/@Testpublic voidtestGetResource()

{

String url= "/xxx/get";

MultiValueMap map = new LinkedMultiValueMap<>();this.setPage(map);

get(url, map);

}/*** 测试 add

*

*@see

*/@Testpublic voidtestAddResource()

{

String url= "/xxx/add";

ResourceBean bean= newResourceBean();

ResourceBean anotherBean= newResourceBean();

bean.setResName("test res1");

anotherBean.setResName("test res2");

MvcResult result=post(url, JSONObject.toJSONString(bean));

ReturnVal returnVal= this.getReturnVal(result);

RES_LIST.add(returnVal.getData().getId());

MvcResult anotherResult=post(url, JSONObject.toJSONString(childBean));

ReturnVal anotherReturnVal= this.getReturnVal(anotherResult);

RES_LIST.add(anotherReturnVal.getData().getId());

}/*** 测试updateResource

*

*@see

*/@Testpublic voidtestBupdateResource()

{

String url= "/xxx/update";

ResourceBean bean= newResourceBean();

bean.setId(RES_LIST.get(0));

bean.setResName("test res1");

MvcResult result=post(url, JSONObject.toJSONString(bean));

assertEquals(AbstractController.STATUS_SUCCESS, getReturnVal(result).getStatus());

}/*** 测试delResource

*

*@see

*/@Testpublic voidtestCdelResource()

{

String url= "/xxx/delete";

MultiValueMap map = new LinkedMultiValueMap<>();

map.add("id", RES_LIST.remove(0));

MvcResult result=get(url, map);

assertEquals(AbstractController.STATUS_SUCCESS, getReturnVal(result).getStatus());

}/*** 测试batchDelResource

*

*@see

*/@Testpublic voidtestDbatchDelResource()

{

String url= "/xxx/batchDel";

MultiValueMap map = new LinkedMultiValueMap<>();

StringBuilder params= newStringBuilder();for (int i = 0; i < RES_LIST.size(); i++)

{if (i == RES_LIST.size() - 1)

{

params.append(RES_LIST.get(i));

}else{

params.append(RES_LIST.get(i)).append(",");

}

}

map.add("id", params.toString());

MvcResult result=get(url, map);

assertEquals(AbstractController.STATUS_SUCCESS, getReturnVal(result).getStatus());

}

}

以上测试用例中,@FixMethodOrder很关键,因为增、删、改、查需要指定测试的顺序。MethodSorters.NAME_ASCENDING指定按字母顺序执行测试用例,注意test后的第一个字母,按照A、B、C、D来的。在junit中,@FixMethodOrder的值有三种选择,分别如下:

MethodSorters.DEFAULT:按默认顺序,具体怎样的顺序不确定。

MethodSorters.JVM:按JVM得到的方法顺序。

MethodSorters.NAME_ASCENDING:按字母顺序。

用例中,需要测试用例按指定顺序执行,测试时使用MethodSorters.JVM,有解释说,这个是按照方法中方法的顺序执行,实际测试不可行。最终选择MethodSorters.NAME_ASCENDING按字母指定顺序。几个用例中涉及到数据依赖的问题,在这里,把依赖的数据都放入静态的RES_LIST中,供各方法共享。

ps:

1、以上使用过程中,使用setUp初始化登录,而junit中每个test用例执行前,都会调用setUp方法,导致登录功能频繁调用,实际上只调用一次就好。这个问题有待解决。不过按以上方法,从模拟登录,到指定测试流程均可进行,一般的测试都可以满足。

2、这里描述的只是控制器部分的测试,只是测试http请求的。

以上是项目中一点记录,各位网友有更好的建议,欢迎拍砖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中怎样测试webwervice_junit4单元测试--web项目中模拟登录会话,做全流程测试... 的相关文章

  • 大数据从入门到精通(超详细版)之Hive的DQL操作,学不会算我输!!!

    前言 嗨 各位小伙伴 恭喜大家学习到这里 不知道关于大数据前面的知识遗忘程度怎么样了 又或者是对大数据后面的知识是否感兴趣 本文是 大数据从入门到精通 超详细版 的一部分 小伙伴们如果对此感谢兴趣的话 推荐大家按照大数据学习路径开始学习哦
  • 达梦实现高可用性的实现(failover功能/负载均衡/虚拟ip透明切换)

    达梦实现高可用性的实现 failover功能 负载均衡 虚拟ip透明切换 一 failover功能 基于守护进程和监视器两个内在工具实现 守护进程 监视器 数据守护和读写分离集群 共享存储集群 二 负载均衡 基于jdbc接口和客户端实现读写
  • XSS-Game level 11

    第十一关通过 Referer 利用事件绕过 先看源码 本关有三个参数 keyword 使用 htmlspecialchars 转译 并输出到页面 难度较大 第二个参数 t sort 使用 htmlspecialchars 转译后拼接到 va
  • Dubbo服务控制台Dubbo Admin配置

    Dubbo服务使用Zookeeper作为服务注册中心 Zookeeper对我们来讲是一个黑框 我们无法看到是否存在了什么提供者或消费者 阿里巴巴官方提供了一个Dubbo服务的管理平台Dubbo Admin 提供路由规则 动态配置 服务降级
  • 开源中国iOS客户端学习——(十二)用户登陆

    上一篇博客 开源中国iOS客户端学习 十一 AES加密 中提到将用户名和密码保存到了本地沙盒之中 在从本地读取用户名和密码 这是一个怎样的过程 cpp view plain copy void saveUserNameAndPwd NSSt
  • 《wireshark》怎么抓包

    wireshark是非常流行的网络封包分析软件 功能十分强大 可以截取各种网络封包 显示网络封包的详细信息 可能很多朋友还不知道wireshark怎么抓包 为此小编给大家带来了wireshark抓包教程 不知道的朋友一起来看看吧 iresh
  • leetcode zigzag C++ 争取每日一题,我还是太天真了/(ㄒoㄒ)/~~

    include
  • 数字信号谱估计方法对比仿真——估计自相关,周期图法,协方差法,burg算法,修正协方差法

    目录 一 理论基础 1 1自相关谱估计 1 2周期图法谱估计 1 3协方差法谱估计 1 4burg算法谱估计 1 5修正协方差谱估计 二 核心程序 三 仿真结论 一 理论基础 自相关谱估计 周期图法谱估计 协方差法谱估计 Burg算法谱估计
  • 如何在两天之内写出一篇学术论文:Pete Carr 教授的高效写作秘籍

    文章目录 一 前言 二 主要内容 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 随着科研的不断发展 研究论文已成为每位学者不可或缺的 利器 然而 撰写一篇既有深度又有广度的研究论文却是一项
  • leetcode99-恢复二叉搜索树(两个空间复杂度的解法)

    恢复二叉搜索树 题目 给你二叉搜索树的根节点 root 该树中的 恰好 两个节点的值被错误地交换 请在不改变其结构的情况下 恢复这棵树 示例 思路 嘶 递归递了加一起得两个点 笔试的题是 交换了若干个相邻结点的 恢复成一颗二叉搜索树 估计就
  • 图像处理大作业(用霍夫变换检测硬币及统计硬币个数,并设计GUI界面)

    实现所给硬币图像中的硬币检测及计数 要求完成功能 自行查找 阅读有关的采用Hough变换来检测图像中圆的资料 设计实现所给图像中圆形的检测 要求检测出图像中硬币个数以及各个硬币的直径 本题难度系数 GUI界面设计参考 MATLAB学习笔记
  • obsidian图片链接转换成markdown语法,不关闭wiki链接

    问题 近期尝试使用了obsidian作为我的笔记软件 但是发现obsidian的图片链接会自动使用wiki链接的方式保存 比如这样的格式 图片路径 但是这样的路径 一般的markdown编辑器是识别不了的 这一点我比较不喜欢 因为我想在使用
  • web下载七牛云上面的图片资源

    本文将怎么通过浏览器打包下载七牛云服务器上面的图片资源 如果不用压缩打包处理 可以直接获取流后用对应的out输出就行 不做具体解析 1 先讲怎么打包下载吧 ZipOutputStream我用的是这个工具类 创建 ZipOutputStrea
  • RL-RTX小读之os_sem_wait

    rtl h中定义了 define os sem wait sem tmo os sem wait U32 rt sem wait sem tmo rt sem wait的实现如下 OS RESULT rt sem wait OS ID se
  • for循环遍历列表的注意事项

    一图流
  • 环形链表

    LeetCode 环型链表 给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中没有环
  • 用 JavaScript,五分钟将 Siri 接入 ChatGPT(搬运)

    Siri ChatGPT 使用教程 将 Siri 接入 ChatGPT 直接语音唤醒 并且支持连续对话 第一步 拷贝项目 通过 AirCode 源码链接中右上角的 Get a copy 按钮快速生成一个自己的 AirCode Node js
  • 大数据技术原理与应用---笔记一:大数据概论

    大数据概论 1 大数据概念 1 1 4v说法 1 2 大数据的影响 对科学研究的影响 对思维方式影响 2 大数据相关技术 2 1大数据基本处理流程 3 大数据计算模式 大数据产业 参考书籍 1 大数据概念 1 1 4v说法 1 数据量大 v
  • 【华为上机真题】事件推送

    作者 Linux猿 简介 CSDN博客专家 华为云享专家 Linux C C 云计算 物联网 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 数据结构和算法成神路 精讲 优质好文持续更新中 欢迎小伙伴们点赞 收藏 留言 目录 一

随机推荐

  • 填速度环的大坑以及转向环的疑问还有对PID的魔性认识

    原文 https blog csdn net weixin 30836759 article details 94931014 前几天填补了速度环的大坑 之前速度环是每次获取编码器的返回值来对输出的PWM波进行赋值 发现车总是有气无力 更换
  • Spring Security+Spring Boot 无法访问静态资源 401-跨域问题解决

    401告诉我没有权限 一开始我还以为时静态资源没有开放 package cn hcnet2006 blog hcnetwebsite config import org springframework context annotation
  • java dispose - public void dispose()

    dispose public void dispose 释放由此 Window 其子组件及其拥有的所有子组件所使用的所有本机屏幕资源 即这些 Component 的资源将被破坏 它们使用的所有内存都将返回到操作系统 并将它们标记为不可显示
  • vue项目中如何定义 多个全局自定义指令

    在项目中如果自定义指令太多 不方便在main js中写 那么如何能够全部写在一个文件然后在main js中引入 首先创建一个js文件 用于专门书写指令 directives index js export const imagerror i
  • signed和unsigned区别

    signed和unsigned用于修饰整数类型 包括char 从ANSI C89标准开始支持 signed表示有符号 unsigned表示无符号 有符号数的最大取值要比无符号的小约一半 因为有符号数的最高一位被用来表示符号 默认的int s
  • 剑指offer 专项突破版 119、最长连续序列

    题目链接 思路 同样的可以转化为并查集来做 可以把相邻的数字放到一个子集中 每当搜索到一个数字时就判断和他相邻的数字是否在集合中 如果在就合并 为了方便记录每个集合的大小 可以用一个count集合记录每个子集的大小 在合并集合的时候也要更新
  • vue开发环境准备-  配置npm私服地址

    1 通过config命令 npm config set registry https ip repository npm group 2 命令行方式 npm registry https ip repository npm group in
  • 剑指offer—16.数值的整数次方——分析及代码(Java)

    剑指offer 16 数值的整数次方 分析及代码 Java 一 题目 二 分析及代码 1 二分求解 1 思路 2 代码 3 结果 三 其他 一 题目 给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent
  • 微信小程序监听返回后执行操作

    例如 点击主页面是index进入子页面list list页面onUnload进行监听 onUnload getCurrentPages 获取当前的页面栈 var pageList getCurrentPages var prevPage p
  • Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架 你可以直接使用它来管理你的缓存 Spring 提供了对缓存功能的抽象 即允许绑定不同的缓存解决方案 如Ehcache 但本身不直接提供缓存功能的实现 它支持注解方式使用缓存 非常方便 本文先通过E
  • R 与甲骨文数据挖掘

    特点 使用 Oracle Data Miner 和 Oracle R Enterprise 自动化预测分析过程 深入了解企业中常用的各种统计模型 以及如何使用各种 SQL PLSQL ORE ODM 和本机 R 包将它们自动化以进行预测分析
  • MD5

    package com bochy md5 import java security MessageDigest import java security NoSuchAlgorithmException import com sun ma
  • Linux基础——sudo命令

    sudo 用户提升权限的命令 1 新建用户 并且设置密码 root sanchuang useradd panlinfeng root sanchuang echo 123456 passwd panlinfeng stdin 更改用户 p
  • 爱立信携手河北移动护航张家口"雪如意"国际赛事;亚马逊云科技宣布1000万美元教育和奖学金计划

    国内市场 爱立信携手河北移动护航 雪如意 国际赛事 其中 爱立信与河北移动共同探讨 并采用了 2 6G 4 9G载波聚合功能 该功能可对张家口赛区现有核心赛区热点区域的网络进行整合服用 将下行峰值速率提升至3Gbps以上 让网络吞吐率实现了
  • C语言自定义数据类型——联合体

    一 联合体 1 定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员 特征是这些成员公用同一块空间 所以联合也叫共用体 2 类型声明 union Un int i char c 注 每个成员之间仍是用分号隔开 联合体结束
  • 23.合并K个有序链表

    题目描述 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到一个升序链表中 返回合并后的链表 解题思路 思路一 将所有链表的元素插入vector中 然后将vector排序 再重新形成新的链表 时间复杂度 O N Log N 空
  • java实现五子棋

    java在初期就可以写一些简单的电脑小程序 使用GUI编程可以考验我们的代码能力 之后我会在出一个可能几万字的GUI编程入门 现在我们先看看五子棋 照片我放在最后 代码之后又详细解释 package 数字图像化处理AWT import ja
  • ugui和ngui手写虚拟摇杆功能比较

    第一 ugui点击父图片就移动子图片位置的功能不如ngui好写 第二 ugui没有OnPress回调方法 得手写监听OnPress的事件 第三 ugui用OnDrag来控制子图片有局限性 当鼠标超出摇杆界限时OnDrag没法继续执行 第四
  • 使用docker搭建dvwa环境

    docker search dvwa 搜索官方仓库中关于DVWA的镜像列表 docker pull citizenstig dvwa 下载镜像到本地 docker image ls 列出本地镜像列表信息 docker run name dv
  • java中怎样测试webwervice_junit4单元测试--web项目中模拟登录会话,做全流程测试...

    junit4相对于junit3 基于注解的方式写单元测试用例 使用过程中方便很多 如下缩写均是代码片段 摘录其中关键部分 重要是理解其中知识点 一 编写测试用例基类 RunWith SpringJUnit4ClassRunner class