0

我问这个问题是因为我相信他们这样做是有充分理由的,而且大多数人没有正确使用它,无论如何,从我迄今为止的行业经验来看。但如果我的理论是正确的,那么我不确定他们为什么包含私有访问修饰符......?

我相信,如果正确使用默认访问,它可以在保持封装的同时提供增强的可测试性。它还使私有访问修饰符变得多余。

默认访问修饰符可用于通过对需要对世界其他地方隐藏的方法使用独特的包来提供相同的效果,并且它在不影响可测试性的情况下做到这一点,因为测试文件夹中的包具有相同的能够访问源文件夹中声明的所有默认方法。

我相信这就是 Java 使用包访问作为“默认”的原因。但我不确定为什么它们还包括私人访问,我确定有一个有效的用例......

4

2 回答 2

2

我同意将默认(包私有)修饰符用于测试要访问的内容,但我不同意私有是不必要的。即使对于测试,也有很多不需要可见的东西。

对于一个好的测试,实现细节是不必要的,并且不应该在类外可见。测试的“白盒”越多,它就越脆弱。我通常将默认修饰符限制为我希望通过依赖注入设置并在测试中手动设置的字段。(我也可以使用构造函数注入并摆脱它,但这更方便。)

于 2013-12-02T14:54:03.017 回答
0

我建议进行一点思想实验。考虑这段代码:

public void promoteUser(User user)
{
    int newRank = computeNew(user);
    user.setRank(newRank);
}

private int computeNewRank(User user)
{
    return user.getRank() + 1;
}

人们可能会觉得computeNewRank应该进行测试(真正的实现可能会做更多的事情)。但是让我们暂时忘记这一点,并通过内联的魔力做到这一点:

public void promoteUser(User user)
{
    int newRank = user.getRank() + 1;
    user.setRank(newRank);
}

这个实验的美妙之处在于它适用于任何规模的私有方法。您总是可以想象自己内联私人成员并问自己“我真正想在这里测试什么?” . 是私有方法本身还是伪装成私有方法的具有全新功能的新类/组件?关键是,您应该很少(如果有的话!)需要测试私有(甚至包/内部)成员。对于外部世界,对于您的合同消费者来说,这些都是无关紧要的细节。

现在,我们当然可以用系统测试代替一切。但是,您的常规工作流程会是什么样子?如果为了测试排名促销代码,您必须登录用户,注册会话,等待 3 分钟,输入促销代码,接收短信,确认......你明白我的意思了。

记住单元测试是为你准备的,而不是相反。您可以弯曲它们、调整它们、使它们合身,这样您就可以交付质量更好的软件。他们的目的不是帮助您实现100% 覆盖率的神奇目标,而是为您提供有关您正在做什么的即时反馈,以便您可以更快地对遇到的错误和故障做出反应。或者换句话说,提高你的生产力

于 2013-12-02T16:19:16.183 回答