gpt4 book ai didi

java - 关于现场可访问性的单元测试实践

转载 作者:行者123 更新时间:2023-12-02 01:33:50 24 4
gpt4 key购买 nike

例如,我有一个树数据结构

public class Tree {
class Node {
//stuffs...
}

private Node root;

// ...
}

我使用的是junit4。在我的单元测试中,我想在需要遍历树的地方运行一些健全性检查(例如检查二叉搜索树属性是否保留)。但由于 root 保持 private,我无法在类之外遍历它。

我可以考虑的是:

  1. root 的 getter 可以防止引用本身被更改,但外部代码仍然可能更改 root 中的字段。
  2. 测试不是数据结构本身的一部分,我真的不想将它放在 Tree 类中。即使我这样做了,我也必须在测试完成后删除它们。

请告诉我正确的做法,谢谢。

最佳答案

您可以执行多种操作,其中一些选项是:

  1. 创建一个公共(public) getter(但这会破坏代码封装,只有当您由于某种奇怪的原因无法将测试放在同一个包中时才应该考虑)

  2. 编写一个包私有(private)的 getter 并将测试放在同一个包中(可能是最好的解决方案)

  3. 使用反射来访问该值(不推荐)

我个人会选择选项 2(请参阅我的最后一段以获取我的推荐答案,因为我不会执行上述任何操作)。这是我们在工业中用来测试我们通常无法访问的东西的方法。它是侵入性极小的,不会像公共(public) getter 那样破坏封装,并且不需要您执行侵入性反射代码。

作为关于为什么我们不使用(3)的讨论,我曾经参与过一个项目,其中首席开发人员决定在他的所有单元测试中完全这样做。有数以万计的单元测试,它们都使用反射来验证事物。我们通过将它们从反射辅助库中转换出来而获得了足够好的性能增益,以至于在运行单元测试时我们得到了更多的快速反馈。

此外,您应该问问自己是否需要进行此类测试。虽然测试很好,但理想情况下,您应该对您的东西的界面进行单元测试,而不是深入到断言一切正常。如果您需要重构您的类,这将变得非常痛苦,因为当您触及任何东西时,您将使一堆测试无效。因此,我建议仅测试公共(public)方法,并在测试中非常严格。

关于java - 关于现场可访问性的单元测试实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55522337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com