2013-08-26 131 views
2

考虑一个链表类,我维护2个私有变量1. firstNode和2. lastNode。这些变量仅用于内部使用,因此不通过getter公开。我想测试操作是否按预期修改这两个变量。例如:如果最后一个节点是重复的,排除已排序链接列表中的重复应该更改最后一个节点。如何测试一个私有变量?

  1. 我应该为单元测试添加一个显式的getter吗?

  2. 如果不是那么如何访问私有未暴露变量的值?

+1

您应该考虑在公共接口上测试该变量值的* observable effect *。 –

+2

很难从这里说出你应该做什么,但需要测试一个私有变量应该意味着你需要改变你的设计。 –

+0

@TonyHopkinson不是真正的恕我直言(并根据经典的TDD做法)。甚至在实施之前,他应该能够编写测试。然后,他应该能够通过快速的实施来进行测试。然后,他应该能够在不打破测试的情况下改进他的设计。 – herman

回答

1
  1. 你不知道。你会将你的测试与你的实现结合起来。如果你要重构你的实现,你应该有信心,如果你的测试不需要修改就可以继续工作,你不会破坏任何东西。

如果这些变量未正确更新,请考虑会出现什么问题(即合同的哪一部分将被违反)。为此写一个测试,证明它应该失败,然后确保它不会失败。

+0

所以不要这样做,因为你使用的东西可能会改变,而是以另一种方式做它,正在使用可以改变。 (我不明白为什么你不应该测试私人) – puser

+0

@puser你的私有变量可能会改变,而不会改变外部,例如,你只是重构一些代码。在这种情况下,你不希望必须修复测试。相反,你希望测试能够提供外部确实有变化的保险。 – herman

+0

感谢您的回复。通过改变而不改变外部,你的意思是变量的名称可以改变?如果是这样,重构可以在你的单元测试中重构对它的引用。如果不是,你能解释一下你的意思吗?谢谢 – puser

0

你可以尝试使它成为包级别的获得者。 get函数不会被暴露,但你仍然可以检查。

+0

听起来很合理,但这是典型的行业? – JavaDeveloper

+0

我发现真正的单元测试只在大约一半的公司中完成。那些做单元测试的人,只需很少的手续就可以做到。 Google是我所知道的唯一一个强制进行高质量单元测试的人。通常情况下,代码编写者可以自由地为自己的单元测试做任何事情。 –

+0

我会尝试放宽访问修饰符前的其他选项。你应该几乎不需要那样做。 – herman

3

你不应该测试私有变量,只有公开的东西。测试私人数据正在测试非常脆弱的实施细节。如果你想改变你的实现,那些测试会失败或不再编译。

而是编写只测试公共API的测试。在你使用链表的例子中,你的测试应该修改列表,然后使用公共方法遍历结构,从节点到节点,以确保所有节点都是正确的。

+1

+1强调它是应该测试的公共API – herman

3

不要这样做。您应该测试链接列表的行为,而不是它的实现。计算出链表在各种情况下的行为方式,并根据其预期行为推导出测试用例。如果你发现自己编写的测试用例需要研究类的实现(包括它的私有成员),那么你的测试实际上并不能确保类的行为是正确的。

+1

提及*行为* :) – herman