当我学习“测试驱动开发”时,我从“生产程序员”一书中找到了一个有趣的案例:
您需要找到“完整号码”的所有因素。完整的数字是其所有因子的总和(除了与数字本身相等的因子)等于数字。因此
6
是最小完整数,其因子为1, 2, 3
。
如果我想要TDD,首先我想测试一个最简单的测试用例:
@Test public void completeNumber6() {
CompleteNumber completeNumber = new CompleteNumber(6)
assertEquals(completeNumber.findFactors(), new Int[] {1,2,3});
}
但是!问题是这个最简单的案例将驱动findFactors()
的所有实现,这对我来说似乎太过分了。
作者给出了一些建议,我们可以将需求分成几个步骤:
我们可以先TDD前两步:
@Test public void testIsFactor() {}
@Test public void testAddFactor() {}
之后会有2种公开(至少非私人)方法:
boolean isFactor(Int n1, Int n2)
void addFactor(Int factor)
问题是这两种方法在整个实现后应该是私有,因为它们应该只在内部由findFactors
使用!
但如果将它们改为私有,那么对于它们的现有测试用例我们该怎么办?
作者建议我们可以将它们更改为 private ,并使用Java refection API来获取和测试它们。听起来很可能,但我不确定这样做是不是很好。
我也问过一些朋友,他们还提供了一些其他选择:
isFactor
和addFactor
不私有,这是可以接受的FactorChecker
和FactorCollector
我现在真的很困惑,哪种方法是TDD的最佳实践?
答案 0 :(得分:0)
在我看来,问题陈述这些是完整数字的事实有点无关紧要。您可以计算任何整数的因子。因此,我开始实现findFactors(1),然后继续努力。
这使得它在经典Prime Factors Kata上略有不同,唯一的区别是您在因子列表中添加了1。