Spcok测试代码抛异常场景

测试代码抛异常场景

`class ExceptionSpec extends Specification {def validateService = new ValidateService()@Unrolldef "验证UserInfo"() {when: "调用校验方法"validateService.validateUser(user)then: "捕获异常并设置需要验证的异常值"def exception = thrown(expectedException)exception.errorCode == expectedErrCodeexception.errorMessage == expectedMessagewhere: "验证用户的合法性"user                || expectedException | expectedErrCode | expectedMessagenull                || APIException      | "1001"          | "userInfo is null"new UserInfo(0, "") || APIException      | "1002"          | "id is not legal"new UserInfo(1, "") || APIException      | "1003"          | "name is not legal"}
}` 

Spock内置thrown()方法,可以捕获调用业务代码抛出的预期异常并验证,再结合where表格的功能,可以很方便的覆盖多种自定义业务异常。

then​标签里用到了Spock的thrown()​方法,这个方法可以捕获我们要测试的业务代码里抛出的异常。thrown()​方法的入参expectedException​,是我们自己定义的异常变量,这个变量放在where​标签里就可以实现验证多种异常情况的功能。expectedException​类型调用validateUser​方法里定义的APIException​异常,可以验证它所有的属性,errorCode​、errorMessage​是否符合预期值。

注意事项

在Spock中,异常条件(如thrown​和notThrown​)只能在then​块的顶层使用,不能嵌套在其他控制结构(如if​语句)中。这意味着你不能在if​语句内部使用thrown​方法。

为了测试不同输入数据下的方法行为,包括抛出异常和不抛出异常的情况,你需要将这些测试拆分为单独的测试用例。每个测试用例只测试一种情况:要么是抛出异常,要么是不抛出异常。

测试案例代码

// 测试捕获异常 RuntimeException 异常def "checkUrlThrowException"() {given:SSRFUtilwhen:SSRFUtil.checkUrl(requestUrl)then:def exception = thrown(expectedException)where:requestUrl          || expectedException"https://baidu.com" || RuntimeException}// 测试不抛异常def "checkUrlNotException"() {given:SSRFUtilwhen:SSRFUtil.checkUrl(requestUrl)then:def exception = notThrown(expectedException)where:requestUrl                                  || expectedException"https://xxx.aaa.com/xxx/xxxx.xlsx"     || null"https://xxx.aaa.net/xxx/xxxx.xlsx"     || null"https://xxx.vip.aaa.com/xxx/xxxx.xlsx" || null}

其它

下面的案例来自于 小美智能助理 的答案.

在Spock中,where​块用于数据驱动测试,通过提供多个输入数据集来测试方法的行为。在测试方法不抛出异常的情况下,可以在then​块中使用notThrown​方法来验证没有异常被抛出。你可以结合where​块和notThrown​方法来测试方法在不同输入数据下的行为。

以下是一个示例,展示了如何在where​块中测试方法在不同输入数据下不抛出异常的情况。

示例代码

假设你有一个Calculator​类,它的divide​方法在除以零时会抛出一个IllegalArgumentException​,在其他情况下正常工作。

class Calculator {int divide(int a, int b) {if (b == 0) {throw new IllegalArgumentException("Division by zero")}return a / b}
}

你可以使用where​块来测试divide​方法在不同输入数据下的行为,不抛出异常的情况如下:

import spock.lang.Specification
import spock.lang.Unrollclass CalculatorSpec extends Specification {@Unrolldef "should return correct result when dividing #a by #b"() {given:def calculator = new Calculator()when:def result = calculator.divide(a, b)then:result == expectednotThrown(Exception)where:a | b || expected10 | 2 || 515 | 3 || 520 | 4 || 5}
}

在这个示例中:

  • @Unroll​注解用于展开每个数据驱动的测试用例,以便更好地查看每个测试用例的结果。
  • where​块定义了测试数据,包括输入参数a​和b​以及期望的结果expected​。
  • then​块中,我们验证result​是否等于期望值,并确保没有抛出任何异常。
结合测试抛异常和不抛异常

你还可以在同一个测试方法中结合测试方法抛出异常和不抛出异常的情况:

import spock.lang.Specification
import spock.lang.Unrollclass CalculatorSpec extends Specification {@Unrolldef "should handle division correctly for a=#a and b=#b"() {given:def calculator = new Calculator()when:def result = calculator.divide(a, b)then:if (b == 0) {def e = thrown(IllegalArgumentException)e.message == "Division by zero"} else {result == expectednotThrown(Exception)}where:a | b || expected10 | 2 || 510 | 0 || _15 | 3 || 520 | 4 || 5}
}

在这个示例中:

  • @Unroll​注解用于展开每个数据驱动的测试用例,以便更好地查看每个测试用例的结果。

  • where​块定义了测试数据,包括输入参数a​和b​以及期望的结果expected​。

  • then​块中,我们使用了条件语句来分别处理抛出异常和不抛出异常的情况。

    • 如果b == 0​,我们期望抛出IllegalArgumentException​,并验证异常的消息内容。
    • 否则,我们验证result​是否等于期望值,并确保没有抛出任何异常。

通过这种方式,你可以在数据驱动的测试中测试方法在不同输入数据下是否抛出异常或不抛出异常,并验证方法的行为是否符合预期。

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

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

相关文章

注意力机制的原理

注意力机制的原理 注意力机制是深度学习中的一种关键组件,尤其是在处理序列数据,如自然语言处理任务时,它允许模型关注输入序列的不同部分,而不是对所有元素赋予相同的权重。其基本思想是为每个输入位置赋予一个权重,…

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融…

《2024天猫618大促-首波男装销售报告》

这份报告主要分析了2024年天猫618大促期间的首波男装销售情况,从多个维度进行了深入的复盘和分析。报告中不仅包含了销售数据的统计分析,还对消费者行为、品牌表现、产品趋势等方面进行了详细的解读。通过对这些数据和信息的深入挖掘,报告揭示了当前男装市场的一些重要趋势和特…

qt经典界面框架

目的 其实就是一个简单的界面显示,是很常用的形式。 说起来简单也是简单,但当初,刚开始做时,感觉非常的复杂,不知如何下手。 现在感觉简单多了。 这个框架利用了QT的现成的MainWindow与QDockWidget,这样就…

Vue3 + TS 防抖动

目录 一、防抖动 1、概念 2、原理 3、应用场景 1、概念 通过将多次连续触发的函数调用合并成一次来减少函数的执行次数。防抖的核心思想是在某个时间段内,只执行一次函数,而忽略在此时间段内的其他触发。 2、原理 (1)、定时器; (2)、重…

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录,通过填写用户名、密码进行登录,如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

把STL容器放入共享内存,重用STL allocator,传入模板参数Allocator,可以实现

问题 Q: 如何用共享内存来存放C STL中中的容器? A: 传入自定义的申请共享内存上空间的allocator,见模板参数Allocator 参考 https://www.zhihu.com/question/319108981/answer/649050789 https://en.cppreference.com/w/cpp/container/vector http://…

自定义User-Agent:使用Python Requests进行网络请求

在网络编程和数据采集领域,HTTP请求是与服务器交互的基本方式。User-Agent(用户代理)是HTTP请求中的一个重要字段,它告诉服务器发起请求的客户端类型和版本信息。在某些情况下,自定义User-Agent可以帮助我们模拟不同的…

CodeIgniter学习笔记 Item6--CI中的常规主题_ci中parent __construct();

$route[default\_controller] welcome; $route[404\_override] ;更重要的功能是,如果我们要实现通过/index.php/news/4.html访问/index.php/article/show/1这样一个需求,可以在routes.php定义路由关系,将原始的URL转换成需要样式 $route[n…

QtSingleApplication

​​​​​​/qtsingleapplication/ qtSingleApplication使用总结-CSDN博客 示例&#xff1a; #include "mainwindow.h" #include <QApplication> #include <QMessageBox> #include "qtsingleapplication/qtsingleapplication.h" int main(…

正向代理与反向代理:深入解析与实例讲解

代理服务器是一种网络实体&#xff0c;它充当客户端与服务器之间的中介&#xff0c;负责转发请求和响应。代理服务器可以根据其使用方式和功能的不同&#xff0c;分为正向代理和反向代理。 转转的面试中问到了正向代理和反向代理。所以本篇文章将详细解析这两种代理方式&#…

产品干货 | 如何通过Power Platform快速创建自定义连接器,让开发集成更简单

引言 Introduction&#xff1a; 最近&#xff0c;微软推出了许多新产品功能。迅易科技作为微软13年来紧密的生态合作伙伴&#xff0c;为300行业头部客户实施1000项目。为此&#xff0c;我们总结了多年的项目经验且产品学习心得&#xff0c;邀请了迅易技术专家为大家持续分享微软…

Oracle数据库之PL/SQL例外(二十三)

在Oracle PL/SQL中&#xff0c;例外&#xff08;或异常&#xff09;是程序设计语言提供的一种功能&#xff0c;旨在增强程序的健壮性和容错性。Oracle PL/SQL中的例外可以分为两大类&#xff1a;系统定义例外和自定义例外。 1. 系统定义例外 系统定义例外是Oracle数据库预先定…

不同系統和流覽器如何檢查代理設置(Mac/Windows/Linux)

本文將詳細介紹如何檢查代理設置&#xff0c;並提供一些建議&#xff0c;幫助你更好地管理和優化代理使用體驗。 為什麼需要檢查代理設置&#xff1f; 代理伺服器的主要功能之一是保護用戶的隱私。如果代理設置不正確&#xff0c;可能會暴露你的真實IP地址&#xff0c;導致隱…

如何自己录制教学视频?零基础也能上手

随着在线教育的蓬勃发展&#xff0c;录制教学视频成为了教师和教育工作者们不可或缺的一项技能。无论是为了远程教学、课程分享还是知识普及&#xff0c;教学视频的录制都变得愈发重要。可是如何自己录制教学视频呢&#xff1f;本文将介绍两种录制教学视频的方法&#xff0c;这…

linux绝对路径与相对路径区别简述

绝对路径与相对路径定义 绝对路径&#xff1a;相对于根路径&#xff0c;只要文件不移动位置&#xff0c;那么它的绝对路径是永恒不变的 相对路径&#xff1a;相对于当前所在目录而言&#xff0c;当前所在的目录可能会改变&#xff0c;所以相对路径不是固定的 路径&#xff…

Availability

译文&#xff1a; #ifndef __AVAILABILITY__ #define __AVAILABILITY__ /* 这些宏都是用在头文件种。它们是作用于和系统版本有关的函数声明或者函数&#xff0c;如果它们是可用的就标示它们首次有效的方法&#xff1b;或者被抛弃的函数。 MAC OS 和_IOS_ 有不同的版本号&…

uniapp小程序button按钮去掉黑色线条

文章目录 导文去除方法 导文 在uniapp的button按钮中有一个莫名其妙的黑色线条 去除方法 button::after{border: none; }该问题并不是所有的手机机型都有&#xff0c;最好添加一下&#xff0c;以防用户手机端样式有问题。 您好&#xff0c;我是肥晨。 欢迎关注我获取前端学习…

Google浏览器快捷方式固定到任务栏启动被其他网页劫持

场景复现 1、Google浏览器设置启动时继续浏览上次打开的网页 2、先浏览CSDN网站&#xff0c;然后关闭Google浏览器 3、再次打开Google浏览器时&#xff0c;除了显示我们上次浏览的CSDN网页外&#xff0c;还默认打开了百度网页 解决办法 1、在Google浏览器中新建标签页&am…

hexo 实战:(三)独立博客运营总结

前言 通过前面两个步骤&#xff0c;完成了静态博客从搭建到基本功能添加和界面优化。那么&#xff0c;这次就要介绍一下搭在 GitHub 上的静态博客如何运营推广。也就是如何让网站被各大搜索引擎收录&#xff1f;如何提高网站权重&#xff0c;提高收录量&#xff1f; 网站收录 …