3年前 (2021-06-14)  Spock系列 |   1 条评论  2306 
文章评分 0 次,平均分 0.0

本篇文章是Spock针对抛异常场景如何测试的补充,在那篇文章中对我们常用的参数校验或条件校验等业务场景代码如何编写单元测试做了讲解,但是有一种情况是,所有的异常测试都测试通过,即抛出了预期的异常类型,但是如何测试正确的case呢?即全部通过校验,没有抛出异常的场景。

简单一点的写法是单独再写一个测试case,只验证这一种通过的场景,跟原来的"thrown() + where"的case分开写,或者在原来的单测方法里再加一个when+then块也可以。

当然了如果你还想复用之前的"thrown() + where"的数据表格语法也可以,就是在调用"validateUser()"方法下面再加一行"throw new Exception()"抛异常的代码就行,这样做的原因是Spock的thrown()方法要求必须有异常抛出,如果你的业务代码里没有抛出异常,则单测会失败!

所以加一行"throw new Exception()"代码的目的是假如我们业务代码测试成功后再抛出一个"正常"的异常(或者叫成功的异常),为了满足thrown()的语法要求。

具体代码如下(完整代码见之前那篇抛异常场景如何测试):

@Unroll
    def "验证用户信息的合法性: #expectedMessage"() {
        when: "调用校验用户方法"
        userController.validateUser(user)
        throw new APIException(00000, "success") // 这里的抛异常,是在validateUser()方法全部验证通过即成功后才会走到这里,属于预期的异常

        then: "捕获异常并设置需要验证的异常值"
        def exception = thrown(APIException)
        exception.errorCode == expectedErrCode
        exception.errorMessage == expectedMessage

        where: "表格方式验证用户信息的合法性"
        user                    ||  expectedErrCode | expectedMessage
        getUser(10001) ||  "10001"                  | "user is null"
        getUser(10002) ||  "10002"                 | "user name is null"
        getUser(10003) ||  "10003"                 | "user age is null"
        getUser(10004) ||  "10004"                 | "user telephone is null"
        getUser(10005) || "10005"                  | "user sex is null"
        getUser(10006) ||  "10006"                 | "user order is null"
        getUser(10007) ||  "10007"                  | "order number is null"
        getUser(10008) ||  "10008"                 | "order amount is null"
        getUser(00000) ||  "00000"                | "success"  // 最后一行case是成功的errorCode和errorMsg校验
    }

这样就既可以测试多种异常case,又可以测试成功的case,如果觉得where表格格式没有对齐,可以使用idea的格式化快捷键对齐下即可。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2009.html

关于

发表评论

表情 格式
  1. 机智

    ydc886 评论达人 LV.1 3个月前 (08-27) [0] [0]

登录

忘记密码 ?

切换登录

注册