为了方法级单元测试,我们可以将方法的访问说明符从私有更改为默认吗

Can we changed the access specifier of a method from private to default just for the sake of method level unit testing

我可以找到很多 questions/answers 来说明为什么一个方法不能成功 public。但我在 Java.

中找不到任何特定于“默认”的内容

'default',即没有修饰符,表示 package private in Java。只有同一个包中的 class 人可以访问它。有时需要在与 class 的其余部分分开的单元测试中测试用于私有使用 class 的内部方法,以便用清晰、简洁和简单的测试覆盖所有代码路径.当您这样做时(结果是更清晰的测试代码,可以更轻松地维护),可以将该方法标记为包私有。

This 并不是一种罕见的策略。因为只有 class 可以使用此方法的人必须驻留在同一个包中,所以您仍然可以充分控制它的使用。

就我个人而言,我建议仅对 static 不依赖于其父 class 状态的实用方法执行此操作。这也是测试抽象静态方法的非常有用的技术 classes.

请注意,在某些情况下,需要测试私有方法可能意味着需要将 class 的那部分拆分为单独的 class。 This discussion shows some of the common standpoints varying from strict OOP adherence to pragmatism。您通常有可能分解该方法并将其变成适当的 public 静态实用程序,但这并不总是有意义,并且不一定会导致更容易维护的代码。

单元测试不是测试代码,它们是测试public可观察行为,即:return值与依赖关系的通信

Public observable 不一定暗示 public 方法,但通常是。我们只是测试其他代码在使用当前单元作为依赖项时将调用的方法。

非 public 方法(不打算由其他代码调用)是 实现细节,有助于单位行为。因此它们隐含地是睾丸。

请记住,单元 未连接到 class 方法。 它甚至可能是一组 classes 在单个 class 后面充当“入口点”。 一个单元是所有可能因相同(非技术)原因而更改的代码,即业务需求的更改。

这里的要点是 实现细节 可能会改变,而 期望的行为 (以及单元测试)会 改变。我们进行此类更改以改进代码设计(解决代码重复、应用设计模式等)。我们称它们为 重构(这是 测试驱动开发 micro cycle 的第三阶段)。这样的重构正是我们最需要 UnitTest 的时候,因为当我们不更改它们时,它们保证测试代码的期望行为仍然存在。