java void方法的单元测试_关于java:Spock单元测试框架实战指南五-void方法测试

本文介绍了如何使用Spock框架对Java中的void方法进行单元测试,特别是关注于无返回值的方法测试。通过示例代码解释了如何验证方法内部逻辑,如调用次数和参数修改等,并展示了使用'2 * moneyDAO.getExchangeByCountry(_) >> 0.1413 >> 0.1421'这样的语法来检查方法执行和返回值。
摘要由CSDN通过智能技术生成

本篇解说如何针对void办法,即无返回后果的办法测试

void办法

void办法的测试不能像后面几篇介绍的那样在then标签里验证返回后果,因为void办法没有返回值

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

一般来说无返回值的办法,外部逻辑会批改入参的属性值,比方参数是个对象,那代码里可能会批改它的属性值,尽管没有返回,但还是能够通过校验入参的属性来测试void办法

还有一种更无效的测试形式,就是验证办法外部逻辑和流程是否合乎预期,比方:

应该走到哪个分支逻辑?

是否执行了这一行代码?

for循环中的代码执行了几次?

变量在办法外部的变动状况?

先看一个void办法的业务代码示例:

/**

* 依据汇率计算金额

* @param userVO

*/

public void setOrderAmountByExchange(UserVO userVO){

if(null == userVO.getUserOrders() || userVO.getUserOrders().size() <= 0){

return ;

}

for(OrderVO orderVO : userVO.getUserOrders()){

BigDecimal amount = orderVO.getAmount();

// 获取汇率(调用汇率接口)

BigDecimal exchange = moneyDAO.getExchangeByCountry(userVO.getCountry());

amount = amount.multiply(exchange); // 依据汇率计算金额

orderVO.setAmount(amount);

}

}

这个void办法次要是遍历userVO上面的订单,通过调用汇率接口计算订单的外币金额,而后再赋值给userVO.orderVO.amount,所以他的外围逻辑在for循环里,那么咱们的测试重点就是验证for循环外面的逻辑是否合乎预期,金额计算是否正确

代码实现

间接看Spock的测试代码如何写:

/**

* 用户服务测试类

* @author 公众号:Java老K

* 集体博客:www.javakk.com

*/

class UserServiceTest extends Specification {

def userService = new UserService()

def moneyDAO = Mock(MoneyDAO)

void setup() {

userService.userDao = userDao

userService.moneyDAO = moneyDAO

}

def "测试void办法"() {

given: "设置申请参数"

def userVO = new UserVO(name:"James", country: "美国")

userVO.userOrders = [new OrderVO(orderNum: "1", amount: 10000), new OrderVO(orderNum: "2", amount: 1000)]

when: "调用设置订单金额的办法"

userService.setOrderAmountByExchange(userVO)

then: "验证调用获取最新汇率接口的行为是否合乎预期: 一共调用2次, 第一次输入的汇率是0.1413, 第二次是0.1421"

2 * moneyDAO.getExchangeByCountry(_) >> 0.1413 >> 0.1421

and: "验证依据汇率计算后的金额后果是否正确"

with(userVO){

userOrders[0].amount == 1413

userOrders[1].amount == 142.1

}

}

}

次要是then标签里的语法: 2 * moneyDAO.getExchangeByCountry(_) >> 0.1413 >> 0.1421,这行代码示意moneyDAO的getExchangeByCountry()办法会被执行2次,第一次输入的后果是0.1413,第二次输入的接口是0.1421

2 * moneyDAO.getExchangeByCountry(_) >> 0.1413 >> 0.1421这行代码也能够离开写,比方只写后面的2 * moneyDAO.getExchangeByCountry(_)

“2 * ” 示意办法理论执行的次数, 如果不是2次则不合乎预期,单元测试会失败,看你具体的传参,比方在given标签里咱们结构的user上面有2个order,订单号别离是1,2,金额别离是1w,1k

那么在调用void办法时,for循环就会循环2次,所以能够通过这样的写法验证咱们调用汇率接口的办法是否执行了,以及执行次数

最初在with()办法里会对入参userVO里的订单金额amount进行校验,因为咱们设置的两单订单金额别离是1w和1k,then标签曾经对汇率接口的返回后果mock了2个不同的汇率值:0.1413、0.1421,那么转换后的外币金额就是1413和142.1元

你也能够将代码改成1 * moneyDAO.getExchangeByCountry(_),而后运行单测,会提醒相应的错误信息:

报错信息阐明理论执行(invoke)了2次

执行几次就写几次,没有执行过就是”0 * “,这正是BDD行为驱动开发思维的体现

(power mock的thenVerify()也能够实现这样的性能,只不过Spock语法更简洁一些)

void + where

如果要联合where测试多分支的void办法时,须要留神一点,因为Spock要求where标签里的表格至多含有两列,如果你的where只是验证入参,也就是只有一列须要验证,那么能够用”_” 示意另外一列值,代码相似上面这样的写法:

where:

requsetParam | _

userVO1 | _

userVO2 | _

userVO3 | _

应用“_”示意任意输出或输入

文章起源:http://javakk.com/297.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值