考虑一个链表类,我维护2个私有变量1. firstNode和2. lastNode。这些变量仅用于内部使用,因此不通过getter公开。我想测试操作是否按预期修改这两个变量。例如:如果最后一个节点是重复的,排除已排序链接列表中的重复应该更改最后一个节点。如何测试一个私有变量?
我应该为单元测试添加一个显式的getter吗?
如果不是那么如何访问私有未暴露变量的值?
考虑一个链表类,我维护2个私有变量1. firstNode和2. lastNode。这些变量仅用于内部使用,因此不通过getter公开。我想测试操作是否按预期修改这两个变量。例如:如果最后一个节点是重复的,排除已排序链接列表中的重复应该更改最后一个节点。如何测试一个私有变量?
我应该为单元测试添加一个显式的getter吗?
如果不是那么如何访问私有未暴露变量的值?
如果这些变量未正确更新,请考虑会出现什么问题(即合同的哪一部分将被违反)。为此写一个测试,证明它应该失败,然后确保它不会失败。
你可以尝试使它成为包级别的获得者。 get函数不会被暴露,但你仍然可以检查。
听起来很合理,但这是典型的行业? – JavaDeveloper
我发现真正的单元测试只在大约一半的公司中完成。那些做单元测试的人,只需很少的手续就可以做到。 Google是我所知道的唯一一个强制进行高质量单元测试的人。通常情况下,代码编写者可以自由地为自己的单元测试做任何事情。 –
我会尝试放宽访问修饰符前的其他选项。你应该几乎不需要那样做。 – herman
你不应该测试私有变量,只有公开的东西。测试私人数据正在测试非常脆弱的实施细节。如果你想改变你的实现,那些测试会失败或不再编译。
而是编写只测试公共API的测试。在你使用链表的例子中,你的测试应该修改列表,然后使用公共方法遍历结构,从节点到节点,以确保所有节点都是正确的。
+1强调它是应该测试的公共API – herman
不要这样做。您应该测试链接列表的行为,而不是它的实现。计算出链表在各种情况下的行为方式,并根据其预期行为推导出测试用例。如果你发现自己编写的测试用例需要研究类的实现(包括它的私有成员),那么你的测试实际上并不能确保类的行为是正确的。
提及*行为* :) – herman
您应该考虑在公共接口上测试该变量值的* observable effect *。 –
很难从这里说出你应该做什么,但需要测试一个私有变量应该意味着你需要改变你的设计。 –
@TonyHopkinson不是真正的恕我直言(并根据经典的TDD做法)。甚至在实施之前,他应该能够编写测试。然后,他应该能够通过快速的实施来进行测试。然后,他应该能够在不打破测试的情况下改进他的设计。 – herman