【问题标题】:Verifying sequence of private method calls in unit testing在单元测试中验证私有方法调用的顺序
【发布时间】:2012-04-11 17:27:55
【问题描述】:

我有以下课程:

class MyClass {

  public void doIt() {
     methodOne();
     methodTwo();
     methodThree();
  }

  private void methodOne() {
     // ...
  }

  // rest of methods similar...

}

我的目的是验证当我调用 doIt() 时,方法 metodOne()、methodTwo() 和 methodThree() 将按顺序被调用。

我正在使用mockito 进行模拟。有谁知道我可以如何测试这种情况?

【问题讨论】:

    标签: java junit mocking mockito


    【解决方案1】:

    讨厌成为那个人,但是:根本不测试这个。测试输出、副作用、结果 - 而不是实现。

    如果您真的想确保正确的顺序,请将这些方法提取到单独的类中并模拟它们。

    【讨论】:

    • 理智的声音已经发出。伟大的第一段。如果您在测试时专注于结果,那么您最终会得到比专注于实现本身更好的结果。
    • 在这种特殊情况下,我实际上并不想测试状态。我想测试我的方法的行为 (martinfowler.com/articles/mocksArentStubs.html)
    • @lefty 测试这些交互是否发生,如果将它们放在另一个可以模拟的对象中,对设计和可维护性确实会更好。
    【解决方案2】:

    只要你的私有方法是……好吧……私有的,就不要测试它们。它们是实现细节。它们可以在不更改类合同的情况下进行重构。测试公共方法的正确结果。

    【讨论】:

    • 我的公共方法只是一个 init() 方法。它不返回任何东西,它只是设置类状态。我想要做的是验证初始化状态是否正确。但是,由于我是从一个我不拥有的类扩展而来的,所以我必须对 init() 内部使用的几个方法进行存根(否则它根本不会运行)。
    • 恕我直言,测试的存在是为了帮助您重构代码,让您确信一切仍在工作。因此,如果您想确保正确的初始化检查它。 (这在遗留代码上可能不是微不足道的。)我认为通过断言某种方式而不是检查结果没有任何好处。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多