Spock单元测试踩坑

1、where块使用@Shared变量踩坑

场景描述

where块中使用了@Shared变量,变量在setup()中初始化

debug时发现图中位置1的createParam.vin与位置2中的createParam.vin拿到的值不一致,2中的vin值为上一个feature运行后的createParam.vin,查看官方文档并未说明where块的执行顺序,从结果中推断stepup()在where块之后运行

解决方法

  • where中不使用createParam参数,createParam.vin替代为"TESTVIN$uuid",uuid必须定义为@Shared变量,全局变量且值唯一
  • 拆成不同的feature method

2、setupSpec()中调用mapper.insertSelective()方法报错:

java.lang.NullPointerException: Cannot invoke method insertSelective() on null object

代码如下:

    @Autowired
    VinQueryRecordMapper vinQueryRecordMapper//注入mapper

    //调用mapper将DO插入数据库
    void insert(int i, String prefix, String productCode) {
        i.times {
            VinQueryRecordDO vinQueryRecordDO = new VinQueryRecordDO(
                    requestId: "test$prefix" + it,
                    vin: "test$prefix" + it,
                    shortVin: StringUtils.right("test$prefix" + it, 4),
                    operator: "test$prefix" + it,
                    status: QueryRecordStatus.PROCESSING.getCode()
            )
            vinQueryRecordMapper.insertSelective(vinQueryRecordDO) //运行后这行报错
        }
    }

    //调用上面定义的insert方法
    def setupSpec() {
        insert(10, 'BX', 'INSURANCE')
        insert(3, 'WB', 'MAINTAIN')
        insert(1, 'WZ', 'VIOLATION')
        insert(2, 'VM', 'VINPARSE')
    }

分析:setupSpec()运行时未注入mapper实例

解决:setupSpec()改成setup()

3、Mock 用注解方式的dubbo服务时未生效

场景:

接口:GPSOrderAppFacade

实现类:GPSOrderQueryFacadeImpl

需要mock的dubbo服务:IovWorkService

说明:测试类GPSOrderQueryFacadeTest调用gpsOrderQueryFacade.query()方法,query()方法内调用了dubbo服务IovWorkService

被调用的服务:

测试类: 

解决:

new GPSOrderQueryFacadeImpl实例,把GPSOrderQueryFacadeImpl里面用到的所有依赖都替换进去,需要注意的是原来的@Autowired注解需要去掉,这样调用gpsOrderQueryFacade.query()方法时用的就是替换后的mock服务了


版权声明:本文为mmdxgj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。