gpt4 book ai didi

java - 使用包私有(private)方法以促进单元测试是一种好习惯吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:39 25 4
gpt4 key购买 nike

有时我发现自己处于这样的情况下,如果我将某些方法的可见性从私有(private)更改为包私有(private),以便促进单元测试模拟、断言...,单元测试会更容易。

一个例子就是这个

假设我有一个包含 4 个属性 X、Y、Z 和 R 的对象 A,其中 X、Y 和 Z 是集合,R 是每个集合的不同元素之间的关系,例如关系将由元素组成X ,Y 的一个元素和 Z 的一个元素。对象 A 不允许直接访问 X、Y、Z 或 R,相反它提供了丰富的 API,允许您在 X、Y 和 Z 上创建新元素,也允许您将这些元素混合到新的 R 元素中。对于单元测试,拥有 public getX()、public getY()、public getZ() 和 public getR() 方法会非常方便,因此我可以在每次调用对象 API。然而,暴露 X、Y 和 Z 是我想避免的事情,这就是为什么从一开始对象就将这些元素设为私有(private),并且仅通过使用其 API 提供对它们的间接访问。然而,提供包私有(private)方法 getX()、getY()、getZ() 和 getR() 是否有意义,以便至少形成单元测试我可以轻松地检查对象的内部状态是否是预期的状态?

缺点当然是增加了方法的可见性,并且考虑到这种方法是私有(private)的,这是有充分理由的,感觉有点奇怪。

当然我可以使用反射来实现同样的效果,但感觉更脏。

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

最佳答案

如果你想测试一个私有(private)方法,你有几个选择:

  1. 依赖注入(inject)

如果您真的需要测试一个私有(private)方法,那么该方法很可能实际上应该是另一个类的公共(public)方法(代码味道)。这意味着如果您在类“A”中有私有(private)方法“m”,您可以考虑将“m”移动为公共(public)方法类 'B' 中的方法,然后将 'B' 注入(inject)到 'A' 中。

这种技术很常见,大多数时候都能奏效。然而,只有当您将代码的重要部分从原始类 ('A') 移至新类 ('B') 时,它才有意义。

此解决方案对 Mockito 友好。

  1. 测试双重继承

将类 'A' 中私有(private)方法 'm' 的可见性更改为 protected 。然后在扩展'A'test 文件夹 中创建一个类'B'。最后,在 'B' 中创建一个公共(public)方法 'pm',其签名与 'm' 相同,只是调用 ' '。通过这种方式,您可以通过 ' 中的 'pm' 访问 'A' 中不可见的 'm' 方法B'.

此解决方案也 Mockito 友好。

  1. 时髦

使用允许您调用私有(private)方法的 JVM 动态语言,例如 Groovy。

  1. 反射(reflection)

使用反射获取私有(private)方法,然后改变它的可见性。参见 this .

  1. 包可见性

将方法声明为包(无可见性约束)并在同一个包中声明测试类。我个人不喜欢使用这个,因为我没有发现优雅的 Java 包可见性。

关于java - 使用包私有(private)方法以促进单元测试是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com