You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java下Spock框架如何配置遇未录制mock调用时强制测试失败

Spock框架拦截未声明Mock调用的实现方案

你要的效果可以通过以下三种方式实现,按需选择即可:

方式1:单测试用例快速配置

直接在测试用例的then块末尾添加0 * _规则即可,该规则代表当前测试用例范围内,所有Mock对象不允许出现任何未提前声明的调用:

def "My Test"(){
  given:
  String id = "sample"

  and:
  1 * userRepoMock.findById(id) >> testUser

  when:
  User user = userServiceUnderTest.findUser(id);

  then:
  user == testUser
  // 新增规则:禁止所有未提前声明的Mock交互
  0 * _
}

新增未声明的anotherRepo.removeTypeById(id)调用时,Spock会直接抛出交互未预期的异常,测试失败。

方式2:单个Mock对象设置为严格模式

创建Mock时指定strict: true,该Mock的所有调用必须提前声明,否则直接测试失败:

// 测试类中定义Mock时添加strict参数
AnotherRepo anotherRepoMock = Mock(AnotherRepo, strict: true)
UserRepo userRepoMock = Mock(UserRepo, strict: true)

方式3:全局配置所有Mock默认开启严格模式

如果要对全项目所有测试生效,在测试资源根目录创建SpockConfig.groovy配置文件,添加如下内容:

import spock.mock.MockNature

spock {
    defaults {
        mock {
            defaultNature = MockNature.STRICT
        }
    }
}

注意事项

  • 全局开启严格模式后,若某个Mock不需要严格校验,可以在创建时单独指定strict: false覆盖全局配置
  • 严格模式下,无返回值的void方法调用也必须提前声明交互规则,符合你要求的新增依赖调用必须同步更新测试用例的诉求

内容的提问来源于stack exchange,提问作者Viraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:39:03