关于字段可访问性的单元测试实践

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


public class Tree {

    class Node {

        //stuffs...

    }


    private Node root;


    // ...

}

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

我能想到的是:

  1. 根的 getter 可以防止引用本身被更改,但外部代码仍可能会更改 中的字段。root

  2. 测试不是数据结构本身的一部分,我真的不想把它放在类中。即使我这样做,我也必须在测试完成后删除它们。Tree

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


泛舟湖上清波郎朗
浏览 53回答 1
1回答

慕尼黑8549860

您可以执行多项操作,其中有几个选项是:做一个公共getter(但这会破坏代码封装,只有在你由于某种奇怪的原因不能将测试放在同一个包中时才应该考虑)编写一个包专用 getter 并将测试放在同一个包中(可能是最佳解决方案)使用反射来访问值(不推荐)我个人会选择选项2(请参阅我的最后一段,了解我推荐的答案,因为我不会做上述任何一项)。这就是我们在工业中用来测试我们通常无法访问的东西。它是微创的,它不会像公共获取器那样破坏封装,也不需要你做侵入式反射代码。作为关于我们为什么不使用(3)的讨论,我曾经参与过一个项目,其中首席开发人员决定在他的所有单元测试中完全这样做。有数以万计的单元测试,它们都使用反射来验证事物。通过将它们从反射辅助库中转换出来,我们获得了性能提升,这足以让我们在运行单元测试时得到更快速的反馈。此外,您应该问问自己是否需要进行此类测试。虽然测试很好,但理想情况下,你应该对你的东西的界面进行单元测试,而不是深入到胆量来断言一切都有效。如果你需要重构你的类,这将使它变得非常痛苦,因为当你触摸任何东西时,你会使一堆测试失效。因此,我建议只测试公共方法,并在测试中非常严格。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java