Groovy Spock-在被测类的私有方法调用中捕获方法参数

Groovy Spock-在被测类的私有方法调用中捕获方法参数,groovy,spock,Groovy,Spock,我正在测试下面的服务级别 @服务 @RequiredArgsConstructor(onConstructor=@_u(@Autowired)) 公共类TaskTemplateService{ @非空 TaskTemplateRepository TaskTemplateRepository; 公共空间{ 名单; doOtherStuff(列表) } 私人物品(清单){ //做事 } } 当我在测试真正的TaskTemplate时,如何捕获传递给doOtherStuff的内容?你不能,为什么要

我正在测试下面的服务级别

@服务
@RequiredArgsConstructor(onConstructor=@_u(@Autowired))
公共类TaskTemplateService{
@非空
TaskTemplateRepository TaskTemplateRepository;
公共空间{
名单;
doOtherStuff(列表)
}
私人物品(清单){
//做事
}
}

当我在测试真正的TaskTemplate时,如何捕获传递给doOtherStuff的内容?

你不能,为什么要这样做

良好的测试意味着指定单元公共接口的行为。私有方法应该通过这种间接测试来覆盖。如果这是不可能的,那么要么您有死的、无法访问的代码,要么您有设计问题,应该重构

顺便说一句,您无法模拟/存根私有方法的技术原因是,大多数模拟工具(也是Spock的内置功能)都使用动态代理(DP)来实现模拟。从技术上讲,DP是子类,但私有方法永远不能被子类扩展,甚至不能被子类看到,也不能被子类或其他类调用,因此术语“private”。因此,模拟子类无法检查与私有方法的交互

您应该如何准确地重新设计类以使其可测试,这实际上取决于您为什么要“捕获”方法参数,正如您所说的。你需要用模拟来代替它吗?是否需要修改或验证原始对象的内容

  • 如果对象具有中心意义,并且您需要替换或验证它,为什么不将其设置为可注入的,而不是将其创建为局部变量,将其与外部世界密封起来并使其不稳定

  • 或者,在您的情况下,您可以将私有方法设置为受保护或包作用域,以使其可测试。然后至少可以为它创建一个mock,您可以捕获参数或存根结果

我在这里主要是猜测,因为答案实际上取决于
//dostuff
背后的内容,即隐藏在示例代码中的信息