java - 使用 Mockito 从链式方法中捕获参数

标签 java unit-testing testing mockito

我正在使用 Mockito 为现有类编写一些 Java 单元测试。但是,我无法提取此类对象调用方法作为嵌套调用一部分的参数。

例子:

public class SomeClass {

  public SomeClass() {
    //...
  }

  public someMethod(Foo foo) {
    // Bar bar = ...
    someOtherMethod(bar);
  }

  private someOtherMethod(Bar bar) {
    //...
  }
}

我想捕获 someOtherMethod() 的参数并验证 bar 是否正确。我可以使用 ArgumentCaptor 或 Mockito 中的其他功能来执行此操作吗?

最佳答案

模拟 someOtherMethod 不太可能为您提供有用的结果。 someMethod 是您公共(public) API 的一部分,但是 someOtherMethod 不是;通常,测试契约(someMethod 的返回值和副作用)很重要,但测试实现(someMethod 调用的私有(private)方法)是一种反模式。

  • 理想情况下,只需测试 someMethod 的结果和副作用,并将其实现视为黑盒。您可能甚至不需要为此使用 Mockito。这是最纯粹的测试驱动开发形式:它使您可以自由地重构 someMethod,也许完全省略对 someOtherMethod 的调用或缓存结果(等)而不编辑您的测试。
  • 如果 someOtherMethod 调用外部服务,请将其设置为您的 SomeClass 实例上的可访问或可设置字段,然后模拟该服务。 与其他服务的交互可以合理地视为一般契约(Contract)的一部分;这正是 Mockito 的设计目的。
  • 如果 someOtherMethod 足够独立以至于您想单独测试 someMethod,请考虑将其设为包私有(private)或 protected 。这样你就可以在你的测试中用一个虚拟的实现来覆盖它,也可能在你的代码的其他地方——毕竟,它现在是你的 someMethod 契约的一个测试部分,对吧?如果它太大或不透明,您还可以考虑将其设为一个单独的可模拟类。

另见 "How do I unit test private methods?"在 Programmers.SE 中,或 "How to use Mockito when we cannot pass a mock object to an instance of a class"在 StackOverflow 上。

关于java - 使用 Mockito 从链式方法中捕获参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500779/

相关文章:

java - OpenCSV 从最后一行和特定列获取值

php - 在 Laravel 中测试 Stripe

testing - Web辅助功能测试工具

c - "assert in C"和 "assert in model checking like CBMC"有什么区别?

c++ - Unicode 文件名测试平台

java - 如何从线程返回值(java)

java - 使用java将文件从本地窗口机器复制到远程窗口机器

java - 从 xml 获取特定值

perl - 当我使用 Test::Harness::runtests 运行 Perl 模块测试时,为什么它们会失败?

java - 模拟静态类