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
相关产品推荐
相关产品推荐

