被测类的私有方法调用中的Spock-Capture方法参数

问题描述 投票:0回答:1

我正在尝试在下面测试我的服务类

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TaskTemplateService {
  @NonNull
  TaskTemplateRepository taskTemplateRepository;

  public void doStuff() {
    List<MyObject> list;
    doOtherStuff(list)
  }

  private void doOtherStuff(List <MyObject>) {
    //do stuff
  }
}

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

groovy spock
1个回答
0
投票

您不能,为什么要呢?

[良好的测试意味着指定单位公共界面的行为。应该通过这种方式间接测试来涵盖私有方法。如果这不可能,则说明您死了,无法访问的代码或设计问题,应进行重构。

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

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

  • 如果对象具有中心含义,并且您需要替换或验证它,为什么不使它可注入而不是将其创建为局部变量,将其与外界隔绝并使其无法测试?

    ] >
  • 或者,在您的情况下,您可以将私有方法设置为受保护或以包为范围,以使其可测试。然后至少可以为其创建一个模拟,并且您可以捕获参数或对结果进行存根。

  • 我主要是在这里猜测,因为答案实际上取决于//do stuff的含义,即您在示例代码中隐藏的信息。

© www.soinside.com 2019 - 2024. All rights reserved.