Java:我们应该在多大程度上封装我们的方法和类?

时间:2013-06-12 06:53:59

标签: java unit-testing tdd

我们应该在多大程度上封装我们的方法和类?例如,除了getter和setter之外,还应该将其他哪些非静态方法声明为public?

如果我们宣布了太多私人方法,我们如何为他们进行单元测试呢?

我听到一句话说“如果你的私有方法如此复杂以至于它需要一个单独的单元测试,那通常意味着它应该得到它自己的类”,那么我们怎样才能决定一个方法是否足够复杂以便单独进行单元测试? (例如,对于像getter / setter这样的方法,我们不需要对它们进行正确的测试)

3 个答案:

答案 0 :(得分:1)

我们应该声明我们想要在类的包之外访问的公共方法,换句话说,包含类的公共API的方法

答案 1 :(得分:1)

如果无法更改可见性,可以使用反射来测试私有方法:

Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

如果您可以更改可见性,则可以使这些方法受到保护并创建子类(仅在JUnits中使用的存根)以测试方法。 另一种策略是通过测试公共方法来测试私有方法。有时很难实现,因为你必须创建许多模拟连接问题,数据库问题等的Stub类。

关于可见度,Oracle docs说:

Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to.

答案 2 :(得分:0)

如果您不想对类和方法进行版本化,则将其封装起来。 如果你想保留一些永不改变的核心部分,那么将其封装起来,只需通过对象访问它们或获取set方法。 你需要聪明地划清界限,太多的公共事物会造成代码漏洞。所以要小心,因为安全性意味着安全。