如何在Spock的Spec外部类/方法中定义Mock交互?
Spock中Mock交互的定义与替代方案
1. 在其他类或方法中定义Mock交互
在Spock里,完全可以把Mock交互的配置逻辑抽离出来,提升复用性:
- 测试类内的辅助方法:如果只是当前测试类复用,直接写个方法传入Mock对象即可
def setupUserServiceMocks(userService) { userService.test("test") >> "result" // 还能添加其他交互规则 } // 测试方法里调用 def "verify mock interaction"() { given: def userService = Mock() setupUserServiceMocks(userService) expect: userService.test("test") == "result" }
- 外部配置类:如果要跨多个测试类复用,写个专门的配置工具类
class MockSetupHelper { static void configureUserService(UserService userService) { userService.test("test") >> "result" } } // 测试类里调用 def "test with external mock config"() { given: def userService = Mock() MockSetupHelper.configureUserService(userService) expect: userService.test("test") == "result" }
2. 用工具方法替代>>语法
当然可以,Spock本身就提供了等价的方法调用语法替代>>,最常用的就是thenReturn():
userService.test("test").thenReturn("result")
和>>效果完全一致,只是写法不同。如果你想自己封装工具方法也没问题,比如:
class MockUtils { static <T> void returnValueWhenCalled(def mockCall, T value) { mockCall >> value } } // 使用示例 MockUtils.returnValueWhenCalled(userService.test("test"), "result")
不过原生的thenReturn()已经足够简洁,自定义工具方法更多是满足个性化需求。
3. 以上方案在Spock中完全可行
Spock的Mock机制设计得很灵活,不管是把交互配置抽离到外部方法/类,还是用thenReturn()替代>>语法,都是官方支持的常规用法,不会有任何兼容性问题。
内容的提问来源于stack exchange,提问作者Sebastian Dusza
相关产品推荐
相关产品推荐

