使用包私有方法来促进单元测试是一种好习惯吗?

问题描述 投票:9回答:5

有时候,如果我将某些方法的可见性从private更改为package private以方便进行单元测试模拟,断言……,我会发现单元测试会更容易。

一个例子就是这个

说我有一个对象A,它包含4个属性X,Y,Z和R,其中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()有意义,这样至少构成单元测试,我就可以轻松检查对象的内部状态是否是预期的状态?] >

当然,缺点是增加了该方法的可见性,并且由于有充分的理由,这种方法是私有的,因此感觉有点怪异。

当然,我可以使用反射来实现相同的效果,但是感觉甚至更脏了。

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

有时我发现,如果我将某些方法的可视性从private更改为package private以方便进行单元测试模拟,那么单元测试会更容易,...

java unit-testing encapsulation
5个回答
3
投票
通常,好的做法是

not

公开内部逻辑。相反,您必须使您的类可配置。例如,如果您的类需要其他组件(例如HttpComponent等),请尝试使用不同的dependency injection

3
投票
如果要测试私有方法,则可以选择以下几种方法:

0
投票
听起来好像A在管理X,Y,Z和R时做了太多事情。

也许一个好主意是重构代码,使R成为一个单独的类,将X,Y和Z作为输入参数。如果您愿意,可以将班级设置为私有课程。无论哪种方式,您都可以通过提供不同的X,Y和Z来直接测试R。


0
投票
一般建议仅测试该类的公共API(调用私有API并进行测试)。否则,在重构内部API的情况下,您将需要重构大多数测试。

-1
投票
对于单元测试,在测试和模拟私有,静态方法和构造函数时可能会遇到一些问题。因此,您可以选择使用以下两种解决方案之一:
© www.soinside.com 2019 - 2024. All rights reserved.