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

时间:2019-04-04 18:00:38

标签: java unit-testing junit

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

<div class="modal-footer">
    <button type="button" class="btn btn-default" (click)="doHide()">Close</button>
  </div>

我正在使用junit4。在我的单元测试中,我想在需要遍历树的地方运行一些完整性检查(例如,检查是否保留了二进制搜索树的属性)。但是由于public class Tree { class Node { //stuffs... } private Node root; // ... } 被保留为root,所以我无法在课程外遍历它。

我能想到的是:

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 进行公共获取(但这会破坏代码封装,仅当您出于某种奇怪的原因而无法将测试放在同一程序包中时才应考虑)

  2. 编写一个程序包专用的吸气剂并将测试放在相同的程序包中(可能是最佳解决方案)

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

我个人会选择选项2(请参阅我的最后一段作为我的建议答案,因为我不会执行上述任何操作)。这就是我们在行业中用来测试通常无法访问的内容的东西。它是微创的,不会像公共获取程序那样破坏封装,也不需要您执行侵入式反射代码。

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

此外,您应该问自己是否需要进行此类测试。虽然测试很好,但是理想情况下,您应该对产品的 interface 进行单元测试,而不要断言一切都可行。如果您需要重构类,这将使您非常痛苦,因为触摸任何东西都会使大量测试无效。因此,我建议仅测试公共方法,并且在测试中要非常严格。