有时候,如果我将某些方法的可见性从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以方便进行单元测试模拟,那么单元测试会更容易,...
not
公开内部逻辑。相反,您必须使您的类可配置。例如,如果您的类需要其他组件(例如HttpComponent等),请尝试使用不同的dependency injection也许一个好主意是重构代码,使R成为一个单独的类,将X,Y和Z作为输入参数。如果您愿意,可以将班级设置为私有课程。无论哪种方式,您都可以通过提供不同的X,Y和Z来直接测试R。