使用包私有方法以便于单元测试是一个好习惯吗?

Jua*_*ano 9 java unit-testing encapsulation

有时候,如果我将某些方法的可见性从私有更改为私有,为了便于单元测试模拟,断言,我发现自己处于单元测试会更容易的情况下......

一个例子就是这样

假设我有一个包含4个属性X,Y,Z和R的对象A,其中X,Y和Z是集合,R是每个集合的不同元素之间的关系,例如,关系将由X的元素组成, Y的元素和Z的元素.对象A不允许直接访问X,Y,Z或R,而是提供了一个丰富的API,允许您在X,Y和Z上创建新元素,也允许您将这些元素混合成新的R元素.对于单元测试,使用公共getX(),public getY(),public getZ()和public getR()方法非常方便,因此每次调用时我都可以对对象的内部做出确切的断言.对象API.但是,暴露X,Y和Z是我想要防止的,这就是为什么从非常开始的对象使这些元素变得私有,并且只使用它的API提供对它们的间接访问.然而,提供包私有方法getX(),getY(),getZ()和getR()是否有意义,以便至少形成单元测试我可以轻松检查对象的内部状态是否是预期的?

缺点当然是方法的可见性增加,并且鉴于这种方法是私有的,有充分的理由,感觉有点奇怪.

当然我可以使用反射来达到同样的效果,但感觉更脏.

所以问题是,这是一种好的还是坏的做法?这是代码味吗?它会发生在别人身上吗?这有更好的技术吗?

Nam*_*ami 3

一般来说,好的做法是不要暴露内部逻辑。相反,您必须使您的类可配置。例如,如果您的类需要其他组件(例如 HttpComponent 等),请尝试使用不同的依赖项注入技术来提供这些依赖项。然后在测试中,您可以模拟这些依赖项并验证这些模拟。

就您而言,这取决于上下文。大多数时候,您将测试私有函数作为测试公共函数的一部分。因此,您测试不同情况下的公共行为,如果全部通过,则意味着通过该公共函数调用的私有函数也可以工作。