【发布时间】:2015-05-06 05:14:55
【问题描述】:
有时我发现自己在这样的情况下,如果我将某些方法的可见性从私有更改为包私有,以便于单元测试模拟、断言......
一个例子是这样的
假设我有一个包含 4 个属性 X、Y、Z 和 R 的对象 A,其中 X、Y 和 Z 是集合,R 是每个集合的不同元素之间的关系,例如,一个关系将由一个元素组成X ,Y 的一个元素和 Z 的一个元素。对象 A 不允许直接访问 X、Y、Z 或 R,而是提供了丰富的 API,允许您在 X、Y 和 Z 上创建新元素,也允许您将这些元素混合到新的 R 元素中。对于单元测试,拥有公共 getX()、公共 getY()、公共 getZ() 和公共 getR() 方法会非常方便,因此我可以在每次调用对象的内部时做出准确的断言对象 API。然而,暴露 X、Y 和 Z 是我想要防止的,这就是为什么从一开始对象就将这些元素设为私有并且仅通过使用其 API 提供对它们的间接访问。然而,提供包私有方法 getX()、getY()、getZ() 和 getR() 是否有意义,以便至少形成单元测试我可以轻松检查对象的内部状态是否是预期的?
缺点当然是增加了方法的可见性,而且考虑到这种方法是私有的,这是有充分理由的,感觉有点奇怪。
当然我可以使用反射来达到同样的效果,但感觉更脏。
所以问题是,这是一种好的做法还是坏的做法?是代码味道吗?它发生在别人身上吗?有没有更好的技术呢?
【问题讨论】:
-
你能提供一个具体的例子吗?一般来说,首选的方法是重新设计 API,以便您可以直接模拟被测对象的依赖关系。
-
IMO 为了单元测试而增加可见性是错误的。该方法具有这种可见性是有原因的。
标签: java unit-testing encapsulation