【问题标题】:generalise unit testing for private method泛化私有方法的单元测试
【发布时间】:2017-07-10 12:17:56
【问题描述】:

我有一个私有方法,我在其中进行所有验证,该方法将通用对象作为输入参数。这个私有方法被 10 个公共方法调用,传递特定对象,该对象是私有方法的参数列表中提到的通用对象的子类。

我如何编写一个通用测试套件来测试私有方法,然后通过所有 10 种不同的公共方法调用此方法,这样我就不会在每个公共测试方法中重复验证。

我正在使用 testng 和 mockito 进行测试。

【问题讨论】:

  • 不要只描述代码的样子。发布所涉及的类的结构(以及 not 与问题无关的实现细节。)

标签: java unit-testing mockito testng


【解决方案1】:

只有 API 应该进行单元测试。
私有方法不是 API 的一部分。

由于您的验证方法具有核心作用并且它执行特定任务(验证),我认为为了提高单元测试和总体设计的质量,您应该重构您的实际设计。

例如,您可以引入一个新类(例如Validation)并将这个私有方法作为公共方法提取到Validation 类中。
在您的实际类中,通过包含 Validation 类的实例字段来添加对它的依赖:

public class MyClass{
  ...
  private Validation validation;
     MyClass(Validation validation){
       this.validation = validation;
     }
  ...
}

通过这种方式,您可以对 Validation 进行一次单元测试并在用户类中模拟它。

【讨论】:

  • 将功能移出的原则是正确的,但我对“验证”作为一个对象持怀疑态度。现在我认为拥有 FooValidFoo 类会更有意义,但 OP 的描述非常模糊。
  • @Michael 你对命名是正确的。如果没有操作上下文,也许MyValidation 会更好,因为它与MyClass 对称。
【解决方案2】:

UnitTests 通过对象的公共接口 验证公共可观察行为

您的私有方法是您未明确测试的实现细节。

如果您认为 10 多个测试用例不应该涵盖您的代码的这一部分,那么您可以考虑将其移至(新的)服务类(不,不是具有静态方法的那种...... .) 并使用依赖注入将其作为依赖传递。

然后您可以用 mock 替换用于测试的服务类(无需 PowerMock 的帮助)并验证 10 多个测试用例是否调用了依赖项。

您还可以使用自己的一组单元测试来验证新服务类的行为。

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多